lightwaverf 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/lightwaverf +1 -1
- data/lib/lightwaverf.rb +41 -12
- metadata +2 -2
data/bin/lightwaverf
CHANGED
data/lib/lightwaverf.rb
CHANGED
@@ -5,6 +5,7 @@ include Socket::Constants
|
|
5
5
|
class LightWaveRF
|
6
6
|
|
7
7
|
@config_file = nil
|
8
|
+
@log_file = nil
|
8
9
|
@config = nil
|
9
10
|
|
10
11
|
# Display usage info
|
@@ -33,6 +34,11 @@ class LightWaveRF
|
|
33
34
|
@config_file || File.expand_path('~') + '/lightwaverf-config.yml'
|
34
35
|
end
|
35
36
|
|
37
|
+
# Log file getter
|
38
|
+
def get_log_file
|
39
|
+
@log_file || File.expand_path('~') + '/lightwaverf.log'
|
40
|
+
end
|
41
|
+
|
36
42
|
# Get the config file, create it if it does not exist
|
37
43
|
def get_config
|
38
44
|
if ! @config
|
@@ -111,12 +117,12 @@ class LightWaveRF
|
|
111
117
|
# device: (String)
|
112
118
|
# state: (String)
|
113
119
|
def send room = nil, device = nil, state = 'on', debug = false
|
114
|
-
debug
|
120
|
+
debug and ( puts 'config is ' + self.get_config.to_s )
|
115
121
|
rooms = self.class.get_rooms self.get_config
|
116
122
|
state = self.class.get_state state
|
117
|
-
if rooms[room]
|
123
|
+
if rooms[room] and device and state and rooms[room]['device'][device]
|
118
124
|
command = self.command rooms[room], device, state
|
119
|
-
debug
|
125
|
+
debug and ( p 'command is ' + command )
|
120
126
|
self.raw command
|
121
127
|
else
|
122
128
|
STDERR.puts self.usage
|
@@ -141,11 +147,26 @@ class LightWaveRF
|
|
141
147
|
end
|
142
148
|
end
|
143
149
|
|
144
|
-
def energy
|
150
|
+
def energy title = nil, note = nil, debug = false
|
151
|
+
debug and note and ( p 'energy: ' + note )
|
145
152
|
data = self.raw '666,@?'
|
153
|
+
debug and ( p data )
|
146
154
|
# /W=(?<usage>\d+),(?<max>\d+),(?<today>\d+),(?<yesterday>\d+)/.match data # ruby 1.9 only?
|
147
155
|
match = /W=(\d+),(\d+),(\d+),(\d+)/.match data
|
148
|
-
|
156
|
+
debug and ( p match )
|
157
|
+
if match
|
158
|
+
data = { 'message' => { 'usage' => match[1].to_i, 'max' => match[2].to_i, 'today' => match[3].to_i }}
|
159
|
+
data['timestamp'] = Time.now.to_s
|
160
|
+
if note
|
161
|
+
data['message']['annotation'] = { 'title' => title.to_s, 'text' => note.to_s }
|
162
|
+
end
|
163
|
+
debug and ( p data )
|
164
|
+
require 'json'
|
165
|
+
File.open( self.get_log_file, 'a' ) do |f|
|
166
|
+
f.write( data.to_json + "\n" )
|
167
|
+
end
|
168
|
+
data['message']
|
169
|
+
end
|
149
170
|
end
|
150
171
|
|
151
172
|
def raw command
|
@@ -186,7 +207,7 @@ class LightWaveRF
|
|
186
207
|
require 'net/http'
|
187
208
|
require 'rexml/document'
|
188
209
|
url = LightWaveRF.new.get_config['calendar'] + '?singleevents=true&start-min=' + Date.today.strftime( '%Y-%m-%d' ) + '&start-max=' + Date.today.next.strftime( '%Y-%m-%d' )
|
189
|
-
debug
|
210
|
+
debug and ( p url )
|
190
211
|
parsed_url = URI.parse url
|
191
212
|
http = Net::HTTP.new parsed_url.host, parsed_url.port
|
192
213
|
http.use_ssl = true
|
@@ -195,7 +216,7 @@ class LightWaveRF
|
|
195
216
|
doc = REXML::Document.new response.body
|
196
217
|
now = Time.now.strftime '%H:%M'
|
197
218
|
interval_end_time = ( Time.now + interval.to_i * 60 ).strftime '%H:%M'
|
198
|
-
triggered =
|
219
|
+
triggered = []
|
199
220
|
doc.elements.each 'feed/entry' do | e |
|
200
221
|
command = /(\w+) (\w+)( (\w+))?/.match e.elements['title'].text # look for events with a title like 'lounge light on'
|
201
222
|
if command
|
@@ -216,17 +237,25 @@ class LightWaveRF
|
|
216
237
|
event_times = { event_time => 'on', event_end_time => 'off' }
|
217
238
|
end
|
218
239
|
event_times.each do | t, s |
|
219
|
-
debug
|
220
|
-
if t >= now
|
221
|
-
debug
|
240
|
+
debug and ( p e.elements['title'].text + ' - ' + now + ' < ' + t + ' < ' + interval_end_time + ' ?' )
|
241
|
+
if t >= now and t < interval_end_time
|
242
|
+
debug and ( p 'so going to turn the ' + room + ' ' + device + ' ' + s.to_s + ' now!' )
|
222
243
|
self.send room, device, s.to_s
|
223
244
|
sleep 1
|
224
|
-
triggered
|
245
|
+
triggered << [ room, device, s ]
|
225
246
|
end
|
226
247
|
end
|
227
248
|
end
|
228
249
|
end
|
229
|
-
triggered.to_s + " events triggered"
|
250
|
+
triggered.length.to_s + " events triggered"
|
251
|
+
title = nil
|
252
|
+
text = nil
|
253
|
+
if triggered.length > 0
|
254
|
+
debug and ( p triggered.length.to_s + ' events so annotating energy log too...' )
|
255
|
+
title = 'timer'
|
256
|
+
text = triggered.map { |e| e.join " " }.join ", "
|
257
|
+
end
|
258
|
+
self.energy title, text, debug
|
230
259
|
end
|
231
260
|
end
|
232
261
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lightwaverf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ cert_chain: []
|
|
12
12
|
date: 2013-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Interact with lightwaverf wifi link from code or the command line. Control
|
15
|
-
your lights, heating, sockets etc.
|
15
|
+
your lights, heating, sockets etc. Also logs energy usage.
|
16
16
|
email: pauly@clarkeology.com
|
17
17
|
executables:
|
18
18
|
- lightwaverf
|