require 'dotenv/load' require 'pony' require 'mysql2' require 'terminal-table' require 'time' options = { :address => ENV['SMTP_HOST'], :port => ENV['SMTP_PORT'], :enable_starttls_auto => ENV['SMTP_TLS'], :user_name => ENV['SMTP_UNAME'], :password => ENV['SMTP_PWORD'], :authentication => :plain, # :plain, :login, :cram_md5, no auth by default :domain => ENV['SMTP_DOMAIN'] # the HELO domain provided by the client to the server } begin client = Mysql2::Client.new( host: ENV['MARIA_HOST'], port: ENV['MARIA_PORT'], username: ENV['MARIA_UNAME'], password: ENV['MARIA_PWORD'], database: ENV['MARIA_DBASE'] ) puts 'Successfully connected to MariaDB!' puts 'Compiling data...' results_today = client.query(%( SELECT LogDateTime, temp, dew, hum, rrate, rmonth, ryear FROM Realtime WHERE CAST(LogDateTime AS DATE) = CAST(NOW() AS DATE) ORDER BY LogDateTime ASC )) results_now = client.query(%( SELECT LogDateTime, temp, dew, hum, press, presstrendval, rfall, rrate, rainunit, wspeed, wgust, windunit, windTM, TwindTM, wgustTM, TwgustTM FROM Realtime ORDER BY LogDateTime DESC LIMIT 1 )) today = results_today.first now = results_now.first maxmin = { :temp => { :max => { :value => -1000, :time => nil }, :min => { :value => 1000, :time => nil } }, :dew => { :max => { :value => -1000, :time => nil }, :min => { :value => 1000, :time => nil } }, :hum => { :max => { :value => -1, :time => nil }, :min => { :value => 101, :time => nil } }, :rainrate => { :max => { :value => 0, :time => nil } } } results_today.each do |result| # Max Temp if result['temp'] >= maxmin[:temp][:max][:value] maxmin[:temp][:max][:value] = result['temp'].to_f maxmin[:temp][:max][:time] = result['LogDateTime'].strftime('%H:%M') end # Min Temp if result['temp'] <= maxmin[:temp][:min][:value] maxmin[:temp][:min][:value] = result['temp'].to_f maxmin[:temp][:min][:time] = result['LogDateTime'].strftime('%H:%M') end # Max Dew Point if result['dew'] >= maxmin[:dew][:max][:value] maxmin[:dew][:max][:value] = result['dew'].to_f maxmin[:dew][:max][:time] = result['LogDateTime'].strftime('%H:%M') end # Min Dew Point if result['dew'] <= maxmin[:dew][:min][:value] maxmin[:dew][:min][:value] = result['dew'].to_f maxmin[:dew][:min][:time] = result['LogDateTime'].strftime('%H:%M') end # Max Humidity if result['hum'] >= maxmin[:hum][:max][:value] maxmin[:hum][:max][:value] = result['hum'] maxmin[:hum][:max][:time] = result['LogDateTime'].strftime('%H:%M') end # Min Humidity if result['hum'] <= maxmin[:hum][:min][:value] maxmin[:hum][:min][:value] = result['hum'] maxmin[:hum][:min][:time] = result['LogDateTime'].strftime('%H:%M') end # Max Rain Rate if result['rrate'] >= maxmin[:rainrate][:max][:value] maxmin[:rainrate][:max][:value] = result['rrate'].to_f maxmin[:rainrate][:max][:time] = result['LogDateTime'].strftime('%H:%M') end end puts 'Data compiled!' puts 'Generating e-mail body...' table = Terminal::Table.new :title => "Weather Summary as of #{now['LogDateTime'].strftime('%l:%M %p, %a %b %d %Y')}" do |t| t << [ { :value => 'Temperature', :colspan => 2, :alignment => :center }, { :value => 'Dew Point', :colspan => 2, :alignment => :center } ] t << :separator t << [ 'Current', "#{now['temp'].to_s('F')}C", 'Current', "#{now['dew'].to_s('F')}C" ] t << [ "Today's High", "#{maxmin[:temp][:max][:value]}C at #{maxmin[:temp][:max][:time]}", "Today's High", "#{maxmin[:dew][:max][:value]}C at #{maxmin[:dew][:max][:time]}" ] t << [ "Today's Low", "#{maxmin[:temp][:min][:value]}C at #{maxmin[:temp][:min][:time]}", "Today's Low", "#{maxmin[:dew][:min][:value]}C at #{maxmin[:dew][:min][:time]}" ] t << :separator t << [ { :value => 'Humidity', :colspan => 2, :alignment => :center }, { :value => 'Barometric Pressure (SL)', :colspan => 2, :alignment => :center } ] t << :separator t << [ 'Current', "#{now['hum']}%", 'Current', "#{now['press'].to_s('F')} mb" ] t << [ "Today's High", "#{maxmin[:hum][:max][:value]}% at #{maxmin[:hum][:max][:time]}", 'Trend', "#{now['presstrendval']} mb/hr" ] t << [ "Today's Low", "#{maxmin[:hum][:min][:value]}% at #{maxmin[:hum][:min][:time]}", '', '' ] t << :separator t << [ { :value => 'Rain', :colspan => 2, :alignment => :center }, { :value => 'Wind', :colspan => 2, :alignment => :center } ] t << :separator t << [ 'Current Rate', "#{now['rrate']} #{now['rainunit']}/hr", 'Current Speed', "#{now['wspeed']} #{now['windunit']}" ] t << [ "Today's High Rate", "#{maxmin[:rainrate][:max][:value]} #{now['rainunit']} at #{maxmin[:rainrate][:max][:time]}", 'Gust', "#{now['wgust']} #{now['windunit']}" ] t << [ "Today's Total", "#{now['rfall'].to_s('F')} #{now['rainunit']}", "Today's High Speed", "#{now['windTM']} #{now['windunit']} at #{now['TwindTM']}" ] t << [ 'Monthly Total', "#{today['rmonth'].to_s('F')} #{now['rainunit']}", "Today's High Gust", "#{now['wgustTM']} #{now['windunit']} at #{now['TwgustTM']}" ] t << [ 'Yearly Total', "#{today['ryear'].to_s('F')} #{now['rainunit']}", '', '' ] end puts 'E-mail body generated!' puts 'Sending e-mail...' Pony.mail( :to => ENV['MAIL_RECIPIENT'], :from => ENV['MAIL_SENDER'], :subject => 'Daily Weather Summary', :body => table.to_s, :via => :smtp, :via_options => options ) puts 'E-mail sent!' puts 'DONE!' rescue Mysql2::Error => e puts "Error connecting to database: #{e.message}" ensure client&.close # Ensure the connection is closed end