#!/usr/bin/env ruby # FIXME $LOAD_PATH << '/usr/local/lib/ruby/2.5.0/gems/mqtt-0.5.0/lib/' $LOAD_PATH << '/usr/local/lib/ruby/2.5.0/gems/optimist-3.0.1/lib/' require 'optimist' require 'sqlite3' def main options = Optimist::options do opt :db, "SQLite3 database file", :type => :string, :required => true, :short => '-d' opt :from, "Calculate power consumption from date/time", :type => :string, :required => false, :short => '-f' opt :to, "Calculate power consumption to date/time", :type => :string, :required => false, :short => '-t' end db = SQLite3::Database.new options[:db] today = Date.today if ! options[:from] from = Date.new(today.year, today.month, 1).to_time else from = Time.parse(options[:from]) end if ! options[:to] to = Time.parse "#{today.year}-#{today.month}-#{today.day}T23:59:59" else to = Time.parse(options[:to]) end handles = db.execute "SELECT DISTINCT handle FROM power" handles.map! { |i| i[0] }.sort! max_handle_size = handles.map { |i| i.size }.max totals = {} totals.default = 0.0 handles.each { |handle| first = db.execute "SELECT total FROM power WHERE timestamp >= #{from.to_i} AND timestamp <= #{to.to_i} AND handle='#{handle}' ORDER BY timestamp ASC LIMIT 1" last = db.execute "SELECT total FROM power WHERE timestamp >= #{from.to_i} AND timestamp <= #{to.to_i} AND handle='#{handle}' ORDER BY timestamp DESC LIMIT 1" if first.size == 1 and last.size == 1 consumption = last.first.first - first.first.first totals[handle] += consumption end } puts "Power consumption from #{from} to #{to} = #{totals.values.inject(:+).round 1} kW/h" puts "\nBy handle" puts "---------" totals.each_key { |handle| puts " - #{handle.ljust(max_handle_size)} = #{totals[handle].round(2).to_s.ljust(4)} kW/h" } db.close end main