wink_scheduler 0.0.3 → 0.0.4

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: 257aa680bf39c29694d5f954c88670d252edb130
4
- data.tar.gz: 1e29b204166b0dbcb921d2958340ccce33d00782
3
+ metadata.gz: 8c4c103d9560e9ab6289aebb057cece51f4bd069
4
+ data.tar.gz: e0c716000fcf8b322943729abf78e3d15c9c39a1
5
5
  SHA512:
6
- metadata.gz: 14ee3c440801ac710d835e2a942ffaab1f3e198aed87fa2e34463c10ab4557c1c4679f4a082c3937c0baa82d6cb1e3d49356d431df93089d1fd074b0f5e7de96
7
- data.tar.gz: b40f52c72e2fb94390d186f5a1560ab75230fc1279d870e7a083f5b3c587a7d9ef1a715a4147f57c47e9ecb8005b7e466dddc5913b0972191b91717154fb04cf
6
+ metadata.gz: 87e299fc57d4d491b5fd276ca735df98c9485bf2e3402b773c222d2e5eef93e7a02ca00798f8f41322e764d203fbc7be89bde378b25b409a34133437627e8534
7
+ data.tar.gz: 2b3659bf153bab01ef4dd33483a9b0802ca694fb6a27be8e3cfc1745dd49e2f542affbb9750f9bb4a6b718dc4befa4e974b2bddd72af874741b00c48cbc25144
data/Dockerfile ADDED
@@ -0,0 +1,8 @@
1
+ FROM ruby:2.1
2
+ MAINTAINER Joe Lanford <joe.lanford@gmail.com>
3
+ WORKDIR /wink_scheduler
4
+ RUN git clone https://github.com/joelanford/wink_scheduler.git /wink_scheduler && \
5
+ git checkout v0.0.4 && \
6
+ bundle install
7
+
8
+ CMD ["bundle", "exec", "bin/wink_scheduler", "/wink_scheduler/conf/schedule.yaml"]
data/Rakefile CHANGED
@@ -1,2 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
+ task :docker do
4
+ system("docker build -t joelanford/wink_scheduler .")
5
+ end
data/bin/wink_scheduler CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  require 'wink_scheduler'
4
4
 
5
+ $stdout.sync = true
6
+ $stderr.sync = true
7
+
5
8
  if ARGV[0]
6
9
  begin
7
10
  conf = YAML.load_file(ARGV[0])
@@ -13,6 +16,8 @@ if ARGV[0]
13
16
  rescue => e2
14
17
  $stderr.puts "ERROR -- #{e2.message}"
15
18
  exit 1
19
+ rescue SystemExit, Interrupt
20
+ exit 1
16
21
  end
17
22
  else
18
23
  $stderr.puts "ERROR: must provide configuration file"
@@ -10,34 +10,31 @@ schedules:
10
10
  method: :on
11
11
  time: :sunset
12
12
  window: 2
13
- location: 12765838
13
+ location: New York, NY
14
14
  - device: Lamp
15
15
  days: :daily
16
16
  method: :off
17
17
  time: 12:00 AM
18
18
  window: 10
19
- location: 12765838
20
19
  - device: Family Room
21
20
  days: :daily
22
21
  method: :on
23
22
  time: :sunset
24
23
  window: 10
25
- location: 12765838
24
+ location: New York, NY
26
25
  - device: Family Room
27
26
  days: :daily
28
27
  method: :off
29
28
  time: 12:00 AM
30
29
  window: 10
31
- location: 12765838
32
30
  - group: My Group
33
31
  days: :daily
34
32
  method: :on
35
33
  time: :sunrise
36
34
  window: 10
37
- location: 12765838
35
+ location: New York, NY
38
36
  - device: My Group
39
37
  days: :daily
40
38
  method: :off
41
39
  time: 8:00 AM
42
40
  window: 10
43
- location: 12765838
@@ -1,11 +1,14 @@
1
1
  require 'winker'
2
2
  require 'weather-api'
3
+ require 'httparty'
3
4
  require 'yaml'
4
5
  require 'time'
6
+ require 'rufus-scheduler'
5
7
 
6
8
  module WinkScheduler
7
9
  class Schedule
8
10
  def initialize(opts, devices, groups)
11
+ @scheduler = Rufus::Scheduler.new
9
12
  if opts["device"]
10
13
  @object = devices.select { |d| next if d == nil; d.name == opts["device"] }[0]
11
14
  raise "device \"#{opts["device"]}\" not found" unless @object
@@ -47,7 +50,7 @@ module WinkScheduler
47
50
 
48
51
  if (@time == :sunrise || @time == :sunset)
49
52
  if opts["location"]
50
- @location = opts["location"]
53
+ @woeid = get_woeid(opts["location"])
51
54
  else
52
55
  raise "Schedule must define 'location' option if time used is sunrise or sunset"
53
56
  end
@@ -56,7 +59,7 @@ module WinkScheduler
56
59
 
57
60
  def run
58
61
  while true
59
- run_once
62
+ execute
60
63
  end
61
64
  end
62
65
 
@@ -78,31 +81,37 @@ module WinkScheduler
78
81
  end
79
82
  end
80
83
 
81
- def run_once
82
- cur_time = Time.now
83
- randomness = @window ? rand(@window*60) - @window*60/2 : 0
84
- next_time = get_next_time + randomness
84
+ def get_woeid(location)
85
+ HTTParty.get("http://where.yahooapis.com/v1/places.q('#{location}')?appid=dj0yJmk9V3pRYU83TjVYRVlNJmQ9WVdrOWEwVTNTM0oxTkdjbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD05NQ--").parsed_response["places"]["place"]["woeid"]
86
+ end
87
+
88
+ def execute
89
+ next_time = get_next_time
85
90
  puts "Scheduled \"#{@method}\" on #{@type} \"#{@object.name}\" at #{next_time}."
86
- while Time.now < next_time
87
- sleep 1
91
+ @scheduler.at next_time do
92
+ @object.send(@method)
88
93
  end
89
- @object.send(@method)
94
+ @scheduler.join
90
95
  puts "Executed \"#{@method}\" on #{@type} \"#{@object.name}\" at #{next_time}."
91
96
  end
92
97
 
93
98
  def get_next_time
99
+ now = Time.now
94
100
  time = case @time
95
101
  when :sunset
96
- Weather.lookup(@location).astronomy.sunset
102
+ Weather.lookup(@woeid).astronomy.sunset
97
103
  when :sunrise
98
- Weather.lookup(@location).astronomy.sunrise
104
+ Weather.lookup(@woeid).astronomy.sunrise
99
105
  else
100
106
  Time.parse(@time)
101
107
  end
102
108
  time += @offset
103
- possible_next_times = 0.upto(6).collect{ |i| time + 3600*24*i }
104
- cur_time = Time.now
105
- possible_next_times.select{ |t| t > cur_time && @days.include?(t.wday) }[0]
109
+ randomness = @window ? rand(@window*60) - @window*60/2 : 0
110
+ adj_time = time + randomness
111
+ while adj_time < now || !@days.include?(adj_time.wday)
112
+ adj_time += 86400
113
+ end
114
+ return adj_time
106
115
  end
107
116
  end
108
117
  end
@@ -1,3 +1,3 @@
1
1
  module WinkScheduler
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "weather-api", "~> 1.2"
22
22
  spec.add_dependency "winker", "~> 0.0", ">= 0.0.15"
23
+ spec.add_dependency "httparty", "~> 0.13", ">= 0.13.7"
24
+ spec.add_dependency "rufus-scheduler", "~> 3.2"
23
25
 
24
26
  spec.add_development_dependency "bundler", "~> 1.7"
25
27
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wink_scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Lanford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-26 00:00:00.000000000 Z
11
+ date: 2016-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: weather-api
@@ -44,6 +44,40 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 0.0.15
47
+ - !ruby/object:Gem::Dependency
48
+ name: httparty
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.13'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.13.7
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.13'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.13.7
67
+ - !ruby/object:Gem::Dependency
68
+ name: rufus-scheduler
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '3.2'
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '3.2'
47
81
  - !ruby/object:Gem::Dependency
48
82
  name: bundler
49
83
  requirement: !ruby/object:Gem::Requirement
@@ -82,6 +116,7 @@ extensions: []
82
116
  extra_rdoc_files: []
83
117
  files:
84
118
  - ".gitignore"
119
+ - Dockerfile
85
120
  - Gemfile
86
121
  - LICENSE.txt
87
122
  - README.md
@@ -113,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
148
  version: '0'
114
149
  requirements: []
115
150
  rubyforge_project:
116
- rubygems_version: 2.2.2
151
+ rubygems_version: 2.4.8
117
152
  signing_key:
118
153
  specification_version: 4
119
154
  summary: Schedule actions for Wink devices.