msg-chumby-display 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.1.0
@@ -6,23 +6,51 @@ $:.unshift << libpath
6
6
  require 'rubygems'
7
7
  require 'msg-chumby-daemon.rb'
8
8
 
9
+ #TODO: Make generic. This is the ID of the CC-HPC flukso.
10
+ sensor_id="67e9fa794684e4902730be208e9d734e"
11
+ token="bb8640e074de14b9d444be7b1359707f"
12
+
9
13
  reading_cache=MSG_Chumby::Reading_Cache.new();
10
14
  $demo_importer=MSG_Chumby::DemoReadingImporter.new(reading_cache, 400);
11
- $importer_thread=nil;
12
- $server=MSG_Chumby::HTTP_XML_Server.new("127.0.0.1", 3000, reading_cache);
15
+ $lasthour_importer=MSG_Chumby::LastHourImporter.new(reading_cache, sensor_id, token);
16
+ $lastday_importer=MSG_Chumby::LastDayImporter.new(reading_cache, sensor_id, token);
17
+ $shortterm_thread=nil;
18
+ $longterm_thread=nil;
19
+ $server=MSG_Chumby::HTTP_XML_Server.new("0.0.0.0", 3000, reading_cache);
20
+
13
21
 
14
22
  def startAll
15
23
  $server.start();
16
- $importer_thread=Thread.new() {
17
- $demo_importer.doWork();
24
+ $shortterm_thread=Thread.new() {
25
+ loop do
26
+ puts "Running short term import"
27
+ begin
28
+ $demo_importer.doWork();
29
+ rescue StandardError => e
30
+ puts "ERROR in short-term thread: #{e}"
31
+ end
32
+ sleep(3);
33
+ end
34
+ }
35
+ $longterm_thread=Thread.new() {
36
+ loop do
37
+ puts "Running long term import"
38
+ begin
39
+ $lasthour_importer.doWork();
40
+ $lastday_importer.doWork();
41
+ rescue StandardError => e
42
+ puts "ERROR in long-term thread: #{e}"
43
+ end
44
+ sleep(10);
45
+ end
18
46
  }
19
47
  $server.join();
20
- $importer_thread.join();
21
48
  end
22
49
 
23
50
  def stopAll
51
+ $shortterm_thread.stop() unless $importer_thread.stop?;
52
+ $longterm_thread.stop() unless $importer_thread.stop?;
24
53
  $server.stop()
25
- $importer_thread.stop() unless $importer_thread.stop?;
26
54
  exit;
27
55
  end
28
56
 
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'xmlsimple'
3
3
  require 'mongrel'
4
+ #require 'pp'
4
5
 
5
6
  module MSG_Chumby
6
7
  $counter=0;
@@ -48,6 +49,74 @@ module MSG_Chumby
48
49
  end
49
50
  end
50
51
 
52
+ class LastHourHandler < Mongrel::HttpHandler
53
+ def initialize(reading_cache)
54
+ @reading_cache=reading_cache;
55
+ end
56
+ def process(request, response)
57
+ response.start(200) do |head,out|
58
+ head["Content-Type"] = "text/xml"
59
+ readings=(@reading_cache.last_hour())
60
+ # Even if there are currently no readings we need to provide
61
+ # them.
62
+ if readings==nil
63
+ readings = Array.new();
64
+ (0..59).each {|i|
65
+ timestamp = Time.now.to_i - (i * 60)
66
+ readings << Flukso::UTCReading.new(timestamp, 0.0)
67
+ }
68
+ end
69
+ flat_data=Array.new;
70
+ readings.each{|reading|
71
+ if not reading.nan? #(reading.value*1.0).nan?
72
+ # Skip NaN values.
73
+ #else
74
+ time=Time.at(reading.utc_timestamp);
75
+ current_reading=
76
+ {'time' => [ time.strftime("%H:%M:%S")], 'value' => [reading.value]};
77
+ flat_data << current_reading
78
+ end
79
+ }
80
+ #pp flat_data
81
+ out.write(XmlSimple.xml_out( { 'reading' => flat_data} ,{'RootName' => "last_hour"}));
82
+ end
83
+ end
84
+ end
85
+ class LastDayHandler < Mongrel::HttpHandler
86
+ def initialize(reading_cache)
87
+ @reading_cache=reading_cache;
88
+ end
89
+ def process(request, response)
90
+ response.start(200) do |head,out|
91
+ head["Content-Type"] = "text/xml"
92
+ readings=(@reading_cache.last_day())
93
+ # Even if there are currently no readings we need to provide
94
+ # them.
95
+ if readings==nil
96
+ readings = Array.new();
97
+ (0..95).each {|i|
98
+ timestamp = Time.now.to_i - (i * 60 * 15)
99
+ readings << Flukso::UTCReading.new(timestamp, 0.0)
100
+ }
101
+ end
102
+ flat_data=Array.new;
103
+ readings.each{|reading|
104
+ if not reading.nan? #(reading.value*1.0).nan?
105
+ # Skip NaN values.
106
+ time=Time.at(reading.utc_timestamp);
107
+ current_reading= {
108
+ 'dayofyear' => [ time.strftime("%j")],
109
+ 'time' => [ time.strftime("%H:%M:%S")],
110
+ 'value' => [reading.value]
111
+ };
112
+ flat_data << current_reading
113
+ end
114
+ }
115
+ #pp flat_data
116
+ out.write(XmlSimple.xml_out( { 'reading' => flat_data} ,{'RootName' => "last_day"}));
117
+ end
118
+ end
119
+ end
51
120
 
52
121
  class HTTP_XML_Server
53
122
  def initialize(host, port, reading_cache)
@@ -55,6 +124,8 @@ module MSG_Chumby
55
124
  @server.register("/time", TimeHandler.new)
56
125
  @server.register("/reset", ResetHandler.new)
57
126
  @server.register("/last_reading", LastReadingHandler.new(reading_cache))
127
+ @server.register("/last_hour", LastHourHandler.new(reading_cache))
128
+ @server.register("/last_day", LastDayHandler.new(reading_cache))
58
129
  end
59
130
  def start
60
131
  @threads=@server.run
@@ -5,6 +5,10 @@ module MSG_Chumby
5
5
  def initialize
6
6
  @last_reading=nil;
7
7
  @last_reading_mutex=Mutex.new();
8
+ @last_hour=nil;
9
+ @last_hour_mutex=Mutex.new();
10
+ @last_day=nil;
11
+ @last_day_mutex=Mutex.new();
8
12
  end
9
13
  def update_last_reading(reading)
10
14
  raise "Please provide a UTCReading instance" if reading.class != Flukso::UTCReading
@@ -19,5 +23,33 @@ module MSG_Chumby
19
23
  end
20
24
  return retval
21
25
  end
26
+ def update_last_hour(readings)
27
+ raise "Please provide an Array instance" if readings.class != Array
28
+ @last_hour_mutex.synchronize do
29
+ @last_hour=readings
30
+ end
31
+ end
32
+ def last_hour
33
+ retval=nil
34
+ @last_hour_mutex.synchronize do
35
+ retval=@last_hour
36
+ end
37
+ return retval
38
+ end
39
+ def update_last_day(readings)
40
+ raise "Please provide an Array instance" if readings.class != Array
41
+ @last_day_mutex.synchronize do
42
+ @last_day=readings
43
+ end
44
+ end
45
+ def last_day
46
+ retval=nil
47
+ @last_day_mutex.synchronize do
48
+ retval=@last_day
49
+ end
50
+ return retval
51
+ end
52
+
53
+
22
54
  end
23
55
  end
@@ -5,21 +5,65 @@ if __FILE__ == $0
5
5
  end
6
6
 
7
7
  module MSG_Chumby
8
+ BASE_URL="https://api.mysmartgrid.de/sensor"
8
9
  class DemoReadingImporter
9
10
  def initialize(reading_cache, max_reading)
10
11
  @reading_cache=reading_cache
11
12
  @max_reading=max_reading
12
13
  end
13
14
  def doWork
14
- loop do
15
- value=rand(@max_reading)
16
- reading=Flukso::UTCReading.new(Time.now.to_i, value)
17
- #puts "generated random reading #{reading}"
18
- @reading_cache.update_last_reading(reading);
19
- sleep(3);
20
- end
15
+ value=rand(@max_reading)
16
+ reading=Flukso::UTCReading.new(Time.now.to_i, value)
17
+ #puts "generated random reading #{reading}"
18
+ @reading_cache.update_last_reading(reading);
21
19
  end
22
20
  end
21
+ class LastHourImporter
22
+ def initialize(reading_cache, sensor_id, token)
23
+ @reading_cache=reading_cache
24
+ auth=Flukso::TokenAuth.new(token);
25
+ @api=Flukso::API.new(auth, BASE_URL);
26
+ @query=Flukso::QueryReadings.new(sensor_id, :hour, :watt)
27
+ end
28
+ def doWork
29
+ begin
30
+ readings=@query.execute(@api);
31
+ rescue Exception => e
32
+ puts "Query failed: #{e}"
33
+ puts "Used #{BASE_URL} as BASE_URL"
34
+ exit(-10);
35
+ end
36
+ #puts "Got Response:"
37
+ #readings.each{|reading|
38
+ # puts reading
39
+ #}
40
+ @reading_cache.update_last_hour(readings);
41
+ end
42
+ end
43
+ class LastDayImporter
44
+ def initialize(reading_cache, sensor_id, token)
45
+ @reading_cache=reading_cache
46
+ auth=Flukso::TokenAuth.new(token);
47
+ @api=Flukso::API.new(auth, BASE_URL);
48
+ @query=Flukso::QueryReadings.new(sensor_id, :day, :watt)
49
+ end
50
+ def doWork
51
+ begin
52
+ readings=@query.execute(@api);
53
+ rescue Exception => e
54
+ puts "Query failed: #{e}"
55
+ puts "Used #{BASE_URL} as BASE_URL"
56
+ exit(-10);
57
+ end
58
+ #puts "Got Response:"
59
+ #readings.each{|reading|
60
+ # puts reading
61
+ #}
62
+ @reading_cache.update_last_day(readings);
63
+ end
64
+ end
65
+
66
+
23
67
  end
24
68
 
25
69
  if __FILE__ == $0
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msg-chumby-display
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mathias Dalheimer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-06-02 00:00:00 +02:00
12
+ date: 2010-06-08 00:00:00 +02:00
13
13
  default_executable: msg-chumby-daemon
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency