humble_rpi 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ef02172efd60c32a60f3d2f25375826669caae4
4
- data.tar.gz: f9fdd9c800d89cec60331511d5d60aabdd6af972
3
+ metadata.gz: 12bfe9a1e6e0b92814f02b33bfa4067c8ce5b64f
4
+ data.tar.gz: db7d231f2ff614a478adc7a117fe7388ee77ba22
5
5
  SHA512:
6
- metadata.gz: 811f0df96ccf1fce3b0b0ee51c744b27f7d498afef9cc26bf332e1d2a817abac2daec21bb92f3c9fd86fae2738747e691b552685d4324dff4a09407530c8b11f
7
- data.tar.gz: 03163f5e89f259f44b738b8caa27daeb029da16381cd2d04c8797ea2461eafe618e188048b777b8eea2fcc31974a3f2e1de99f11f844982768214806f99cdd16
6
+ metadata.gz: d9166aacd59e9bc7b29ff98e705380eeca3cf5b06a10fde43f9ae2fcd9409655c6de07b2069dec70dbd1599368e344c4047320cb4f44b190e26e6703865fe301
7
+ data.tar.gz: 2199950e22e505c3693d0d128f1f1e4fd886cafdfad34518fce053f460515b66b8e4407144fe97f24108660cdb10b4c56c1f77ab499e775446cc1b76baaa2ccd
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/humble_rpi.rb CHANGED
@@ -2,169 +2,95 @@
2
2
 
3
3
  # file: humble_rpi.rb
4
4
 
5
- require 'rpi'
6
- require 'chronic_duration'
7
5
  require 'sps-pub'
8
- require 'rpi_lcd16x2'
9
- require 'websocket-eventmachine-client'
6
+ require 'sps-sub'
10
7
 
11
8
 
12
- class HumbleRPi
13
- include PiPiper
9
+ class DummyNotifier
10
+
11
+ def notice(message)
12
+ puts Time.now.to_s + ' - ' + message
13
+ end
14
+
15
+ end
14
16
 
15
- attr_reader :led, :lcd
17
+ class HumbleRPi
16
18
 
17
- def initialize(options={})
19
+ def initialize(device_name: 'rpi', sps_address: nil, sps_port: 59000, \
20
+ plugins: {})
18
21
 
19
- default_options = {
20
- device_name: 'rpi',
21
- lcd_pins: {},
22
- led_pins: [],
23
- motion_pin: nil,
24
- button_pins: [],
25
- sps_address: nil,
26
- sps_port: '59000'
27
- }
22
+ @device_name, @sps_address, @sps_port = device_name, sps_address, sps_port
23
+
24
+ @publisher, @subscriber = sps_address ? \
25
+ initialize_sps() : [DummyNotifier.new, nil]
28
26
 
29
- @opt = default_options.merge options
30
- send_message :info, 'humble_rpi initialized'
31
- led_pins, lcd_pins = @opt[:led_pins], @opt[:lcd_pins]
27
+ @plugins = initialize_plugins(plugins || [])
28
+
29
+ end
30
+
31
+ # triggered from a sps-sub callback
32
+ #
33
+ def ontopic(topic, msg)
34
+
35
+ component = topic[/\w+$/]
32
36
 
33
- @lcd = RpiLcd16x2.new 'ready', lcd_pins if lcd_pins.any?
34
- @led = RPi.new(led_pins).led if led_pins.any?
35
- @ws = nil
37
+ method_name = "on_#{component}_message".to_sym
36
38
 
37
- if @opt[:motion_pin] or @opt[:button_pins] then
39
+ @plugins.each do |x|
38
40
 
39
- at_exit do
40
-
41
- [@opt[:motion_pin], @opt[:button_pins]].flatten.compact.each do |pin|
42
-
43
- uexp = open("/sys/class/gpio/unexport", "w")
44
- uexp.write(pin)
45
- uexp.close
46
-
47
- end
41
+ if x.respond_to? method_name then
42
+ x.method(method_name).call(msg)
48
43
  end
44
+
49
45
  end
50
- end
46
+ end
51
47
 
52
- def send_message(subtopic, msg)
48
+ def start()
53
49
 
54
- topic, address, port = @opt[:device_name], @opt[:sps_address], @opt[:sps_port]
55
- fqm = "%s/%s: %s" % [topic, subtopic, msg]
56
-
57
- begin
58
- address ? SPSPub.notice(fqm, address: address, port: port) : puts(fqm)
59
- rescue
60
- puts 'humble_rpi: warning, could not publish SPS notice.'
50
+ @plugins.each do |x|
51
+ if x.respond_to? :on_start then
52
+ puts 'starting ' + x.inspect
53
+ Thread.new { x.on_start() }
54
+ end
61
55
  end
62
- end
63
-
64
- protected
65
-
66
- def button_detect()
67
-
68
- send_message :info, 'button press detection activated'
69
-
70
- topic = @opt[:device_name]
71
- address, port = @opt[:sps_address], @opt[:sps_port]
72
-
73
- hrpi = self
74
-
75
- @opt[:button_pins].each.with_index do |button, i|
76
-
77
- puts 'button %s on GPIO %s enabled ' % [i+1, button]
78
-
79
- n = (i+1).to_s
80
-
81
- PiPiper.watch :pin => button.to_i, :invert => true do |pin|
82
56
 
83
- hrpi.send_message 'buttonpressed/' + n, "value %s" % [pin.value]
84
-
85
- end
86
-
57
+ if @subscriber then
58
+ topic = "#{@device_name}/output/#"
59
+ @subscriber.subscribe topic: topic
60
+ else
61
+ loop while true
87
62
  end
88
63
 
89
- PiPiper.wait
90
-
91
- end
92
-
93
- def listener(&blk)
94
-
95
- rpi = self
96
-
97
- c = WebSocket::EventMachine::Client
98
-
99
- Thread.new do
100
-
101
- EM.run do
102
-
103
- @ws = c.connect(uri: "ws://%s:%s" % [@opt[:sps_address], @opt[:sps_port]])
104
-
105
- @ws.onopen do
106
- puts "Client connected"
107
- end
108
-
109
- @ws.onmessage(&blk)
110
-
111
- @ws.onclose do
112
- puts "Client disconnected"
113
- end
114
-
115
- EventMachine.next_tick do
116
- @ws.send "subscribe to topic: #{@opt[:device_name]}/output/#"
117
- end
64
+ end
118
65
 
119
- EventMachine.error_handler{ |e|
120
- puts "Error raised during event loop: #{e.message}"
66
+
67
+ private
68
+
69
+ def initialize_sps()
70
+
71
+ publisher = SPSPub.new address: @sps_address, port: @sps_port
72
+ publisher.notice @device_name + '/info: humble_rpi initialized'
73
+ subscriber = SPSSub.new address: @sps_address, port: @sps_port, callback: self
121
74
 
122
- }
75
+ [publisher, subscriber]
123
76
 
124
- end
125
-
126
- end
127
-
128
- alias led_listener listener
129
77
  end
78
+
79
+ def initialize_plugins(plugins)
130
80
 
131
- def motion_detect()
132
-
133
- send_message :info, 'motion detection activated'
134
- t1 = Time.now - ChronicDuration.parse('1 minute and 10 seconds')
135
- topic = @opt[:device_name]
136
- address, port = @opt[:sps_address], @opt[:sps_port]
137
-
138
- hrpi = self
139
- count = 0
140
-
141
- after pin: @opt[:motion_pin].to_i, goes: :high do
81
+ @plugins = plugins.inject([]) do |r, plugin|
142
82
 
143
- count += 1
83
+ name, settings = plugin
84
+ return r if settings[:active] == false and !settings[:active]
144
85
 
145
- if Time.now > t1 + ChronicDuration.parse(duration='1 minute') then
146
- hrpi.send_message :motion, "detected %s times within the past %s" \
147
- % [count, duration]
148
- t1 = Time.now
149
- count = 0
150
- end
151
-
152
- end
153
- PiPiper.wait
154
-
155
- end
86
+ klass_name = 'HumbleRPiPlugin' + name.to_s
87
+
88
+ vars = {device_id: @device_name, notifier: @publisher}
156
89
 
90
+ r << Kernel.const_get(klass_name)\
91
+ .new(settings: settings, variables: vars)
157
92
 
158
- end
159
-
160
-
161
- if __FILE__ == $0 then
162
-
163
- # example of an RPi running with 1 LED and 1 motion sensor
164
-
165
- f = HumbleRPi.new device_name: 'fortina', led_pins: [17], sps_address: '192.168.4.170', motion_pin: '7'
166
-
167
- sleep 3 # wait for the client to connect
168
- f.motion_detect
93
+ end
94
+ end
169
95
 
170
96
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: humble_rpi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -31,68 +31,8 @@ cert_chain:
31
31
  999CZL08Zqxa+1DKwhW/XqeiQ9eIZ+1fLAK+XbAKgv6ghNYEPtZLUFiD73uUbsKd
32
32
  sBqeV1LF1yKYmA==
33
33
  -----END CERTIFICATE-----
34
- date: 2015-05-19 00:00:00.000000000 Z
34
+ date: 2015-06-14 00:00:00.000000000 Z
35
35
  dependencies:
36
- - !ruby/object:Gem::Dependency
37
- name: rpi
38
- requirement: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: '0.2'
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: 0.2.0
46
- type: :runtime
47
- prerelease: false
48
- version_requirements: !ruby/object:Gem::Requirement
49
- requirements:
50
- - - "~>"
51
- - !ruby/object:Gem::Version
52
- version: '0.2'
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: 0.2.0
56
- - !ruby/object:Gem::Dependency
57
- name: chronic_duration
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: '0.10'
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- version: 0.10.6
66
- type: :runtime
67
- prerelease: false
68
- version_requirements: !ruby/object:Gem::Requirement
69
- requirements:
70
- - - "~>"
71
- - !ruby/object:Gem::Version
72
- version: '0.10'
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: 0.10.6
76
- - !ruby/object:Gem::Dependency
77
- name: websocket-eventmachine-client
78
- requirement: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.1'
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- version: 1.1.0
86
- type: :runtime
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- requirements:
90
- - - "~>"
91
- - !ruby/object:Gem::Version
92
- version: '1.1'
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: 1.1.0
96
36
  - !ruby/object:Gem::Dependency
97
37
  name: sps-pub
98
38
  requirement: !ruby/object:Gem::Requirement
@@ -114,7 +54,7 @@ dependencies:
114
54
  - !ruby/object:Gem::Version
115
55
  version: 0.4.0
116
56
  - !ruby/object:Gem::Dependency
117
- name: rpi_lcd16x2
57
+ name: sps-sub
118
58
  requirement: !ruby/object:Gem::Requirement
119
59
  requirements:
120
60
  - - "~>"
@@ -122,7 +62,7 @@ dependencies:
122
62
  version: '0.2'
123
63
  - - ">="
124
64
  - !ruby/object:Gem::Version
125
- version: 0.2.3
65
+ version: 0.2.0
126
66
  type: :runtime
127
67
  prerelease: false
128
68
  version_requirements: !ruby/object:Gem::Requirement
@@ -132,7 +72,7 @@ dependencies:
132
72
  version: '0.2'
133
73
  - - ">="
134
74
  - !ruby/object:Gem::Version
135
- version: 0.2.3
75
+ version: 0.2.0
136
76
  description:
137
77
  email: james@r0bertson.co.uk
138
78
  executables: []
@@ -163,7 +103,6 @@ rubyforge_project:
163
103
  rubygems_version: 2.4.6
164
104
  signing_key:
165
105
  specification_version: 4
166
- summary: 'Designed for a Raspberry Pi which uses GPIOs for the following: LEDs, a
167
- PIR sensor, a 16x2 LCD or push buttons. Communicates with a SimplePubSub message
168
- broker'
106
+ summary: Controls components wired in through the Raspberry Pi's GPIO pins. see the
107
+ Humble_rpi plugins.
169
108
  test_files: []
metadata.gz.sig CHANGED
Binary file