Class: SAAL::DBStore

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/dbstore.rb

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

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_initializeObject



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_wipeObject



22
23
24
# File 'lib/dbstore.rb', line 22

def db_wipe
  db_query "DROP TABLE sensor_reads"
end

#eachObject



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

Raises:

  • (ArgumentError)


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