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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#!/usr/bin/env ruby
require 'sqlite3'
# Berlin
#$device_id_to_handle = {
# "b7:01" => "outside",
# "ca:01" => "outside",
# "d5:01" => "outside",
# "f4:01" => "outside",
# "1d:01" => "inside",
# "1f:01" => "inside",
# "37:01" => "inside",
# "38:01" => "inside",
# "9c:01" => "inside",
# "cb:01" => "inside"
#}
# Heidenheim
$device_id_to_handle = {
"58:02" => "outside",
"62:02" => "outside",
"07:01" => "inside"
}
def db_execute s, d
begin
$db.execute(s, d)
rescue SQLite3::BusyException
sleep 3
begin
$db.execute(s, d)
rescue SQLite3::BusyException
STDERR.write "DB busy, skipping data point '#{d.to_s}'\n"
end
end
end
def db_insert timestamp, handle, temperature, humidity
db_execute("INSERT INTO weather(timestamp, handle, temperature, humidity) VALUES(?,?,?,?)",
[timestamp, handle, temperature, humidity])
end
$db = SQLite3::Database.new("weather.db")
$db.execute <<-SQL
create table weather(
id INTEGER PRIMARY KEY,
timestamp DATETIME,
handle TEXT,
temperature FLOAT,
humidity FLOAT
);
SQL
while line = STDIN.gets
parts = line.split "\t"
log_entry_type = parts.first.split("::")[1]
if log_entry_type == "temp"
data = {}
parts.each { |i|
key, value = i.split "::"
data[key] = value
}
data["timestamp"] = data["timestamp"].to_i
data["temperature"] = data["temperature"].to_f
data["humidity"] = data["humidity"].to_f
handle = $device_id_to_handle[data["device_id"]]
if handle
db_insert \
data["timestamp"], \
handle, \
data["temperature"], \
data["humidity"]
end
end
end
$db.close
|