Class: SAAL::DBStore
Constant Summary collapse
- MAX_LAST_VAL_AGE =
Only give out last_value if it’s less than 5 min old
5*60
Instance Method Summary collapse
- #average(sensor, from, to) ⇒ Object
- #db_initialize ⇒ Object
- #db_wipe ⇒ Object
- #each ⇒ Object
-
#initialize(conffile = SAAL::DBCONF) ⇒ DBStore
constructor
A new instance of DBStore.
- #last_value(sensor) ⇒ Object
- #maximum(sensor, from, to) ⇒ Object
- #minimum(sensor, from, to) ⇒ Object
- #weighted_average(sensor, from, to) ⇒ Object
- #write(sensor, date, value) ⇒ Object
Constructor Details
#initialize(conffile = SAAL::DBCONF) ⇒ DBStore
7 8 9 10 11 |
# File 'lib/dbstore.rb', line 7 def initialize(conffile=SAAL::DBCONF) @dbopts = YAML::load(File.new(conffile)) @db = nil db_initialize end |
Instance Method Details
#average(sensor, from, to) ⇒ Object
34 35 36 |
# File 'lib/dbstore.rb', line 34 def average(sensor, from, to) db_range("AVG", sensor, from, to) end |
#db_initialize ⇒ Object
13 14 15 16 17 18 19 20 |
# File 'lib/dbstore.rb', line 13 def db_initialize db_query "CREATE TABLE IF NOT EXISTS sensor_reads (sensor VARCHAR(100), date INT, value FLOAT) ENGINE=InnoDB" db_query "ALTER TABLE sensor_reads ADD INDEX sensor_date_value (sensor,date,value) USING BTREE", :ignoreerr => 1061 end |
#db_wipe ⇒ Object
22 23 24 |
# File 'lib/dbstore.rb', line 22 def db_wipe db_query "DROP TABLE sensor_reads" end |
#each ⇒ Object
85 86 87 88 89 90 91 |
# File 'lib/dbstore.rb', line 85 def each db_query "SELECT sensor,date,value FROM sensor_reads" do |r| r.each do |row| yield [row["sensor"],row["date"].to_i, row["value"].to_f] end end end |
#last_value(sensor) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/dbstore.rb', line 70 def last_value(sensor) db_query "SELECT date,value FROM sensor_reads WHERE sensor = '#{db_quote(sensor.to_s)}' AND date > '#{Time.now.utc.to_i - MAX_LAST_VAL_AGE}' ORDER BY date DESC LIMIT 1" do |r| row = r.first if row _date, value = [row["date"].to_i, row["value"].to_f] value else nil end end end |
#maximum(sensor, from, to) ⇒ Object
67 68 69 |
# File 'lib/dbstore.rb', line 67 def maximum(sensor, from, to) db_range("MAX", sensor, from, to) end |
#minimum(sensor, from, to) ⇒ Object
64 65 66 |
# File 'lib/dbstore.rb', line 64 def minimum(sensor, from, to) db_range("MIN", sensor, from, to) end |
#weighted_average(sensor, from, to) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/dbstore.rb', line 38 def weighted_average(sensor, from, to) total_time = 0 total_value = 0.0 previous_value = nil start_time = nil initialized = false db_query "SELECT date,value FROM sensor_reads WHERE sensor = '#{db_quote(sensor.to_s)}' AND date >= #{from.to_s} AND date <= #{to.to_s}" do |r| r.each do |row| date = row["date"].to_i value = row["value"].to_f if start_time elapsed = date - start_time total_value += elapsed * previous_value total_time += elapsed initialized = true end start_time = date previous_value = value end end initialized ? total_value / total_time : nil end |
#write(sensor, date, value) ⇒ Object
26 27 28 29 30 31 32 |
# File 'lib/dbstore.rb', line 26 def write(sensor, date, value) raise ArgumentError, "Trying to store an empty sensor read" if !value raise ArgumentError, "Trying to store an empty timestamp" if !date raise ArgumentError, "Trying to store a timestamp <= 0" if date <= 0 db_query "INSERT INTO sensor_reads VALUES ('"+db_quote(sensor.to_s)+"',"+date.to_s+","+value.to_s+")" end |