summaryrefslogtreecommitdiff
path: root/power-meter
blob: 013da25455f9c5e999570dd034d5c770dffa9047 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/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