msg-flukso-localinterface 0.0.1

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/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "msg-flukso-localinterface"
8
+ gem.summary = %Q{Displays various information from the mySmartGrid project on your Chumby}
9
+ gem.description = %Q{The mySmartGrid project provides means to manage your household energy consumption. This gem provides the runtime environment for the Chumby: it queries the mySmartGrid webservice and forwards that information to a Flash application running on the Chumby.}
10
+ gem.email = "md@gonium.net"
11
+ gem.homepage = "http://github.com/gonium/msg-flukso-localinterface"
12
+ gem.authors = ["Mathias Dalheimer"]
13
+ #gem.add_dependency "xml-simple", ">= 1.0.12"
14
+ gem.bindir='bin'
15
+ gem.executables=['msg-flukso-discover', 'msg-flukso-currentwatts']
16
+ gem.default_executable = 'msg-flukso-discover'
17
+ gem.files = FileList["[A-Z]*", "{bin,lib,test}/**/*"]
18
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
+ end
20
+ Jeweler::GemcutterTasks.new
21
+ rescue LoadError
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
24
+
25
+ require 'rake/testtask'
26
+ Rake::TestTask.new(:test) do |test|
27
+ test.libs << 'lib' << 'test'
28
+ test.pattern = 'test/**/test_*.rb'
29
+ test.verbose = true
30
+ end
31
+
32
+ begin
33
+ require 'rcov/rcovtask'
34
+ Rcov::RcovTask.new do |test|
35
+ test.libs << 'test'
36
+ test.pattern = 'test/**/test_*.rb'
37
+ test.verbose = true
38
+ end
39
+ rescue LoadError
40
+ task :rcov do
41
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
42
+ end
43
+ end
44
+
45
+ task :test => :check_dependencies
46
+
47
+ task :default => :test
48
+
49
+ require 'rake/rdoctask'
50
+ Rake::RDocTask.new do |rdoc|
51
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
52
+
53
+ rdoc.rdoc_dir = 'rdoc'
54
+ rdoc.title = "msg-chumby-display #{version}"
55
+ rdoc.rdoc_files.include('README*')
56
+ rdoc.rdoc_files.include('lib/**/*.rb')
57
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env ruby
2
+ ###
3
+ ##
4
+ # msg-flukso-localinterface: A Ruby library for the Local Flukso
5
+ # Interface
6
+ # Copyright (C) 2010 Mathias Dalheimer (md@gonium.net)
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License along
19
+ # with this program; if not, write to the Free Software Foundation, Inc.,
20
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
+ ##
22
+ ###
23
+
24
+ libpath=File.join(File.dirname(__FILE__), '..', 'lib')
25
+ $:.unshift << libpath
26
+ #puts "Using libraty path #{$:.join(":")}"
27
+
28
+ require 'msg-flukso-localinterface'
29
+ require 'optparse'
30
+ require 'ostruct'
31
+
32
+ ###
33
+ ## Commandline parser
34
+ #
35
+ class Optparser
36
+ CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
37
+ CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
38
+ #
39
+ # Return a structure describing the options.
40
+ #
41
+ def self.parse(args)
42
+ # The options specified on the command line will be collected in *options*.
43
+ # We set default values here.
44
+ options = OpenStruct.new
45
+ options.inplace = false
46
+ options.encoding = "utf8"
47
+ options.verbose = false
48
+ opts = OptionParser.new do |opts|
49
+ opts.banner = "Usage: #{$0} [options]"
50
+ opts.separator ""
51
+ opts.separator "Specific options:"
52
+ opts.on("-t", "--timerange VALUE", "The time range you want to query. Valid queries are: {hour, day, month, year, night}") do |timerange|
53
+ options.timerange = timerange
54
+ end
55
+ opts.on("-u", "--unit VALUE", "The unit you want to query. Valid queries are: {watt, kwh, eur, aud}") do |unit|
56
+ options.unit = unit
57
+ end
58
+ opts.on("-c", "--config FILE", "The file where the configuration lives.") do |file|
59
+ options.config_file = file
60
+ end
61
+ # Boolean switch.
62
+ opts.on("-v", "--verbose", "Run verbosely") do |v|
63
+ options.verbose = v
64
+ end
65
+ opts.on_tail("-h", "--help", "Show this message") do
66
+ puts opts
67
+ exit
68
+ end
69
+ end
70
+ opts.parse!(args)
71
+ options
72
+ end
73
+ end
74
+
75
+ ###
76
+ ## Script startup
77
+ #
78
+ options = Optparser.parse(ARGV)
79
+ $verbose = options.verbose
80
+
81
+ # TODO: Discover Flukso dynamically.
82
+ discoveryMechanism=FluksoLocal::DiscoverStaticConfiguration.new("192.168.1.102", 80);
83
+ location=discoveryMechanism.getFluksoLocation();
84
+ puts "Using Flukso at location #{location}"
85
+
86
+ # Now: Query the Flukso.
87
+ query=FluksoLocal::Query.new(location)
88
+ values=query.getReadings("d69779ec53a9323b695ee86b5328dd28");
89
+ puts "Retrieved #{values.size} seconds of data";
90
+ last_value=values.max
91
+ puts "Last reading: timestamp = #{last_value[0]}, value=#{last_value[1]}"
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env ruby
2
+ ###
3
+ ##
4
+ # msg-flukso-localinterface: A Ruby library for the Local Flukso
5
+ # Interface
6
+ # Copyright (C) 2010 Mathias Dalheimer (md@gonium.net)
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License along
19
+ # with this program; if not, write to the Free Software Foundation, Inc.,
20
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
+ ##
22
+ ###
23
+
24
+ libpath=File.join(File.dirname(__FILE__), '..', 'lib')
25
+ $:.unshift << libpath
26
+ #puts "Using libraty path #{$:.join(":")}"
27
+
28
+ require 'msg-flukso-localinterface'
29
+ require 'optparse'
30
+ require 'ostruct'
31
+
32
+ ###
33
+ ## Commandline parser
34
+ #
35
+ class Optparser
36
+ CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
37
+ CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
38
+ #
39
+ # Return a structure describing the options.
40
+ #
41
+ def self.parse(args)
42
+ # The options specified on the command line will be collected in *options*.
43
+ # We set default values here.
44
+ options = OpenStruct.new
45
+ options.inplace = false
46
+ options.encoding = "utf8"
47
+ options.verbose = false
48
+ opts = OptionParser.new do |opts|
49
+ opts.banner = "Usage: #{$0} [options]"
50
+ opts.separator ""
51
+ opts.separator "Specific options:"
52
+ opts.on("-t", "--timerange VALUE", "The time range you want to query. Valid queries are: {hour, day, month, year, night}") do |timerange|
53
+ options.timerange = timerange
54
+ end
55
+ opts.on("-u", "--unit VALUE", "The unit you want to query. Valid queries are: {watt, kwh, eur, aud}") do |unit|
56
+ options.unit = unit
57
+ end
58
+ opts.on("-c", "--config FILE", "The file where the configuration lives.") do |file|
59
+ options.config_file = file
60
+ end
61
+ # Boolean switch.
62
+ opts.on("-v", "--verbose", "Run verbosely") do |v|
63
+ options.verbose = v
64
+ end
65
+ opts.on_tail("-h", "--help", "Show this message") do
66
+ puts opts
67
+ exit
68
+ end
69
+ end
70
+ opts.parse!(args)
71
+ options
72
+ end
73
+ end
74
+
75
+ ###
76
+ ## Script startup
77
+ #
78
+ options = Optparser.parse(ARGV)
79
+ $verbose = options.verbose
80
+
81
+ # this is how the interface should look like, its a stub only right now.
82
+ discoveryMechanism=FluksoLocal::Discover.new();
83
+ location=discoveryMechanism.getFluksoLocation();
84
+ puts location
85
+
86
+ # This is some test to see how it can be done. HOWL seems to be easier,
87
+ # though.
88
+
89
+ require 'dnssd'
90
+ require 'socket'
91
+ #require 'resolv-replace' # async DNS resolving.
92
+
93
+ #service = DNSSD::Service.new
94
+ #begin
95
+ #timeout 6 do
96
+ # service.browse '_http._tcp' do |r|
97
+ # puts "Found HTTP service: #{r.name}"
98
+ # end
99
+ #end
100
+ #rescue Timeout::Error
101
+ #end
102
+
103
+
104
+ # Browse the network for web servers (_http._tcp services)
105
+ puts "Scanning network for web servers"
106
+ service = DNSSD.browse('_flukso-realtime._tcp.') do |reply|
107
+ if (reply.flags == DNSSD::Flags::Add)
108
+ puts "adding: #{reply.inspect}"
109
+
110
+ # Let's lookup the details
111
+ resolver_service = DNSSD.resolve(reply.name, reply.type, reply.domain) do |resolved|
112
+ puts "\tdomain = #{resolved.domain}"
113
+ puts "\tflags = #{resolved.flags.inspect}"
114
+ puts "\tfullname = #{resolved.fullname}"
115
+ puts "\tinterface = #{resolved.interface}"
116
+ puts "\tname = #{resolved.name}"
117
+ puts "\tservice = #{resolved.service}"
118
+ puts "\ttarget = #{resolved.target}"
119
+ puts "\ttext_record = #{resolved.text_record.inspect}"
120
+ puts "\ttype = #{resolved.type}"
121
+ puts "\tip = #{IPSocket.getaddress(resolved.target).inspect}"
122
+ end
123
+ sleep(2)
124
+ resolver_service.stop
125
+ else
126
+ puts "removing: #{reply.inspect}"
127
+ end
128
+ end
129
+
130
+ # Catch the interrupt signal
131
+ interrupted = false
132
+ Signal.trap("INT") do
133
+ interrupted = true
134
+ end
135
+
136
+ # Run until the application is interrupted
137
+ loop do
138
+ if interrupted
139
+ puts "Halting network scan"
140
+ service.stop
141
+ exit
142
+ end
143
+ end
144
+
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'flukso'
3
+ require 'dnssd'
4
+ require 'msg-flukso-localinterface/discover.rb'
5
+ require 'msg-flukso-localinterface/query.rb'
6
+
@@ -0,0 +1,45 @@
1
+
2
+ module FluksoLocal
3
+
4
+ class Discover
5
+ def initialize
6
+ @collection=FluksoCollection.new();
7
+ end
8
+ def getFluksoLocation
9
+ return Location.new("IP", "PORT");
10
+ end
11
+ end
12
+
13
+ class DiscoverStaticConfiguration
14
+ def initialize(host, port)
15
+ @location=Location.new(host, port);
16
+ end
17
+ def getFluksoLocation
18
+ return @location
19
+ end
20
+ end
21
+
22
+ class Location
23
+ attr_reader :host, :port
24
+ def initialize(host, port)
25
+ @host=host
26
+ @port=port
27
+ end
28
+ def to_s
29
+ return "Flukso at #{@host}:#{@port}"
30
+ end
31
+ end
32
+
33
+ class FluksoCollection
34
+ def initialize()
35
+ @locations=Array.new();
36
+ end
37
+ def locations
38
+ return @locations
39
+ end
40
+ def addLocation(location)
41
+ @location << location
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,43 @@
1
+ require 'net/http'
2
+ require 'json'
3
+
4
+
5
+ module FluksoLocal
6
+ class Query
7
+ def initialize(location)
8
+ @location=location;
9
+ end
10
+ def getRawReadings(sensor_id)
11
+ page="/sensor/#{sensor_id}"
12
+ values=nil
13
+ begin
14
+ Net::HTTP.start(@location.host) do |http|
15
+ puts "retrieving #{page}" if $verbose
16
+ response=http.get(page);
17
+ puts "Raw Response:" if $verbose
18
+ puts response.body if $verbose
19
+ values=response.body
20
+ end
21
+ rescue StandardError => bang
22
+ puts "Cannot query flukso: #{bang}"
23
+ end
24
+ return values
25
+ end
26
+ def getReadings(sensor_id)
27
+ # todo: make appropriate nil values
28
+ retval=Hash.new
29
+ values=getRawReadings(sensor_id);
30
+ if values != nil
31
+ tmp=JSON.parse(values);
32
+ tmp.each{|value|
33
+ timestamp=value[0]
34
+ value=value[1]
35
+ #puts "Found #{timestamp} => #{value}"
36
+ retval[timestamp]=value;
37
+ }
38
+ end
39
+ jj retval if $verbose;
40
+ return retval;
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: msg-flukso-localinterface
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Mathias Dalheimer
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-07 00:00:00 +02:00
19
+ default_executable: msg-flukso-discover
20
+ dependencies: []
21
+
22
+ description: "The mySmartGrid project provides means to manage your household energy consumption. This gem provides the runtime environment for the Chumby: it queries the mySmartGrid webservice and forwards that information to a Flash application running on the Chumby."
23
+ email: md@gonium.net
24
+ executables:
25
+ - msg-flukso-discover
26
+ - msg-flukso-currentwatts
27
+ extensions: []
28
+
29
+ extra_rdoc_files:
30
+ - README
31
+ files:
32
+ - README
33
+ - Rakefile
34
+ - VERSION
35
+ - bin/msg-flukso-currentwatts
36
+ - bin/msg-flukso-discover
37
+ - lib/msg-flukso-localinterface.rb
38
+ - lib/msg-flukso-localinterface/discover.rb
39
+ - lib/msg-flukso-localinterface/query.rb
40
+ has_rdoc: true
41
+ homepage: http://github.com/gonium/msg-flukso-localinterface
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options:
46
+ - --charset=UTF-8
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ hash: 3
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ requirements: []
68
+
69
+ rubyforge_project:
70
+ rubygems_version: 1.3.7
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Displays various information from the mySmartGrid project on your Chumby
74
+ test_files: []
75
+