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
|