hello-sense 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.
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Session
5
+ def authorize_with_password!
6
+ data = {
7
+ grant_type: 'password',
8
+ client_id: @client_id,
9
+ client_secret: @client_secret,
10
+ username: @username,
11
+ password: @password,
12
+ }
13
+ request = Net::HTTP::Post.new('/v1/oauth2/token',
14
+ headers.reject { |key, _| key == :Authorization })
15
+ request.set_form_data(data)
16
+ response = connection.request(request)
17
+ response_data = data_or_error(response)
18
+
19
+ response_data['access_token']
20
+ end
21
+
22
+ def destroy_token
23
+ delete('/v1/oauth2/token')
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Sharing
5
+ def share_insight
6
+ post('/v2/sharing/insight', {})
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module SleepSounds
5
+ # @return [Hash]
6
+ #
7
+ # @example
8
+ # {
9
+ # "availableDurations" => [{
10
+ # "durations" => {
11
+ # "id" => 2,
12
+ # "name" => "30 Minutes"
13
+ # }, {
14
+ # "id" => 3,
15
+ # "name" => "1 Hour"
16
+ # }]
17
+ # },
18
+ # "availableSounds" => [{
19
+ # "sounds" => {
20
+ # "id" => 18,
21
+ # "preview_url" => "https://s3.amazonaws.com/hello-audio/sleep-tones-preview/Aura.mp3",
22
+ # "name" => "Aura"
23
+ # }, {
24
+ # "id" => 20,
25
+ # "preview_url" => "https://s3.amazonaws.com/hello-audio/sleep-tones-preview/Nocturne.mp3",
26
+ # "name" => "Nocturne"
27
+ # }],
28
+ # "state" => "OK"
29
+ # },
30
+ # "status" => {
31
+ # "playing" => false,
32
+ # "sound" => nil,
33
+ # "duration" => nil,
34
+ # "volume_percent" => nil
35
+ # }
36
+ # }
37
+
38
+ def sounds_combined_state
39
+ get('/v2/sleep_sounds/combined_state')
40
+ end
41
+
42
+ # @return [Hash]
43
+ #
44
+ # @example
45
+ # {
46
+ # "durations" => [{
47
+ # "id" => 2,
48
+ # "name" => "30 Minutes"
49
+ # }, {
50
+ # "id" => 3,
51
+ # "name" => "1 Hour"
52
+ # }]
53
+ # }
54
+
55
+ def sound_durations
56
+ get('/v2/sleep_sounds/durations')
57
+ end
58
+
59
+ def play_sound
60
+ post('/v2/sleep_sounds/play')
61
+ end
62
+
63
+ # @return [Hash]
64
+ #
65
+ # @example
66
+ # {
67
+ # "sounds" => [{
68
+ # "id" => 18,
69
+ # "preview_url" => "https://s3.amazonaws.com/hello-audio/sleep-tones-preview/Aura.mp3",
70
+ # "name" => "Aura"
71
+ # }, {
72
+ # "id" => 20,
73
+ # "preview_url" => "https://s3.amazonaws.com/hello-audio/sleep-tones-preview/Nocturne.mp3",
74
+ # "name" => "Nocturne"
75
+ # }],
76
+ # "state" => "OK"
77
+ # }
78
+
79
+ def sounds
80
+ get('/v2/sleep_sounds/sounds')
81
+ end
82
+
83
+ # @return [Hash]
84
+ #
85
+ # @example
86
+ # {
87
+ # "playing" => false,
88
+ # "sound" => nil,
89
+ # "duration" => nil,
90
+ # "volume_percent" => nil
91
+ # }
92
+
93
+ def sounds_status
94
+ get('/v2/sleep_sounds/status')
95
+ end
96
+
97
+ def stop_sounds(data)
98
+ post('/v2/sleep_sounds/stop', data)
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Speech
5
+ # @return [Array]
6
+ #
7
+ # @example
8
+ # []
9
+
10
+ def onboarding_speech
11
+ get('/v1/speech/onboarding')
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Stats
5
+ def update_stats(data)
6
+ patch('/v1/app/stats', data)
7
+ end
8
+
9
+ # @return [Hash]
10
+ #
11
+ # @example
12
+ # {
13
+ # "has_unread_insights" => true,
14
+ # "has_unanswered_questions" => true
15
+ # }
16
+
17
+ def unread_stats
18
+ get('/v1/app/stats/unread')
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Store
5
+ def send_feedback(data)
6
+ post('/v2/store/feedback', data)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Support
5
+ # @return [Array<Hash>]
6
+ #
7
+ # @example
8
+ # [
9
+ # {
10
+ # "topic" => "pairing_sense",
11
+ # "display_name" => Pairing your Sense"
12
+ # },
13
+ # {
14
+ # "topic" => "pairing_a_sleep_pill",
15
+ # "display_name" => Pairing your Sleep Pill"
16
+ # }
17
+ # ]
18
+
19
+ def support_topics
20
+ get('/v1/support/topics')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Timeline
5
+ # Known +event_type+s:
6
+ # * +FELL_ASLEEP+
7
+ # * +GENERIC_MOTION+
8
+ # * +GENERIC_SOUND+
9
+ # * +GOT_IN_BED+
10
+ # * +GOT_OUT_OF_BED+
11
+ # * +IN_BED+
12
+ # * +WOKE_UP+
13
+ #
14
+ # Known +sleep_state+s:
15
+ # * +AWAKE+
16
+ # * +LIGHT+
17
+ # * +MEDIUM+
18
+ # * +SOUND+
19
+ #
20
+ # Known +metrics+ +name+s:
21
+ # * +fell_asleep+
22
+ # * +sound_sleep+
23
+ # * +time_to_sleep+
24
+ # * +times_awake+
25
+ # * +total_sleep+
26
+ # * +woke_up+
27
+ # * +humidity+
28
+ # * +light+
29
+ # * +particulates+
30
+ # * +sound+
31
+ # * +temperature+
32
+ #
33
+ # @param date [String] a date in 'yyyy-MM-dd' format
34
+ # @return [Hash]
35
+ #
36
+ # @example
37
+ # {
38
+ # "score" => 69,
39
+ # "score_condition" => "WARNING",
40
+ # "message" => "You were asleep for **9.0 hours**, and sleeping soundly for 6.5 hours.",
41
+ # "date" => "2017-01-01",
42
+ # "sleep_periods" => [
43
+ # "NIGHT"
44
+ # ],
45
+ # "events" => [{
46
+ # "timestamp" => 1483340220000,
47
+ # "timezone_offset" => -28800000,
48
+ # "duration_millis" => 60000,
49
+ # "message" => "You went to bed.",
50
+ # "sleep_depth" => 0,
51
+ # "sleep_state" => "AWAKE",
52
+ # "event_type" => "GOT_IN_BED",
53
+ # "sleep_period" => "NIGHT",
54
+ # "valid_actions" => [
55
+ # "ADJUST_TIME",
56
+ # "VERIFY",
57
+ # "INCORRECT"
58
+ # ]
59
+ # }],
60
+ # "metrics" => [{
61
+ # "name" => "total_sleep",
62
+ # "value" => 537,
63
+ # "unit" => "MINUTES",
64
+ # "condition" => "IDEAL"
65
+ # }],
66
+ # "locked_down" => false
67
+ # }
68
+
69
+ def timeline(date)
70
+ get("/v2/timeline/#{date}")
71
+ end
72
+
73
+ def create_timeline_event(date, type, timestamp, data)
74
+ put("/v2/timeline/#{date}/events/#{type}/#{timestamp}", data)
75
+ end
76
+
77
+ def update_timeline_event(date, type, timestamp, data)
78
+ patch("/v2/timeline/#{date}/events/#{type}/#{timestamp}", data)
79
+ end
80
+
81
+ def remove_timeline_event(date, type, timestamp)
82
+ delete("/v2/timeline/#{date}/events/#{type}/#{timestamp}")
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ module Trends
5
+ # @param timescale [String] one of +'LAST_WEEK'+, +'LAST_MONTH'+, +'LAST_3_MONTHS'+
6
+ # @return [Hash]
7
+ #
8
+ # @example
9
+ # {
10
+ # "available_time_scales" => [
11
+ # "LAST_WEEK",
12
+ # "LAST_MONTH",
13
+ # "LAST_3_MONTHS"
14
+ # ],
15
+ # "graphs" => [{
16
+ # "time_scale" => "LAST_WEEK",
17
+ # "title" => "Sleep Score",
18
+ # "data_type" => "SCORES",
19
+ # "graph_type" => "GRID",
20
+ # "min_value" => 71.0,
21
+ # "max_value" => 86.0,
22
+ # "sections" => [{
23
+ # "values" => [81.0, 80.0, 78.0, 71.0, 79.0, 86.0, 77.0],
24
+ # "titles" => ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"],
25
+ # "highlighted_values" => [6],
26
+ # "highlighted_title" => 6
27
+ # }],
28
+ # "condition_ranges" => [{
29
+ # "min_value" => 80.0,
30
+ # "max_value" => 100.0,
31
+ # "condition" => "IDEAL"
32
+ # }, {
33
+ # "min_value" => 60.0,
34
+ # "max_value" => 79.0,
35
+ # "condition" => "WARNING"
36
+ # }, {
37
+ # "min_value" => 0.0,
38
+ # "max_value" => 59.0,
39
+ # "condition" => "ALERT"
40
+ # }],
41
+ # "annotations" => [{
42
+ # "title" => "Avg. Weekdays",
43
+ # "value" => 78.8,
44
+ # "data_type" => "SCORES",
45
+ # "condition" => "WARNING"
46
+ # }, {
47
+ # "title" => "Avg. Weekends",
48
+ # "value" => 79.0,
49
+ # "data_type" => "SCORES",
50
+ # "condition" => "WARNING"
51
+ # }, {
52
+ # "title" => "Avg. Overall",
53
+ # "value" => 78.9,
54
+ # "data_type" => "SCORES",
55
+ # "condition" => "WARNING"
56
+ # }]
57
+ # }, {
58
+ # "time_scale" => "LAST_WEEK",
59
+ # "title" => "Sleep Duration",
60
+ # "data_type" => "HOURS",
61
+ # "graph_type" => "BAR",
62
+ # "min_value" => 7.483333,
63
+ # "max_value" => 9.083333,
64
+ # "sections" => [{
65
+ # "values" => [7.85, 8.383333, 7.483333, 7.7, 7.8, 9.083333, 7.6833334],
66
+ # "titles" => ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"],
67
+ # "highlighted_values" => [2, 5],
68
+ # "highlighted_title" => 6
69
+ # }],
70
+ # "condition_ranges" => [],
71
+ # "annotations" => [{
72
+ # "title" => "Avg. Weekdays",
73
+ # "value" => 8.1,
74
+ # "data_type" => "HOURS",
75
+ # "condition" => nil
76
+ # }, {
77
+ # "title" => "Avg. Weekends",
78
+ # "value" => 7.8,
79
+ # "data_type" => "HOURS",
80
+ # "condition" => nil
81
+ # }, {
82
+ # "title" => "Avg. Overall",
83
+ # "value" => 8.0,
84
+ # "data_type" => "HOURS",
85
+ # "condition" => nil
86
+ # }]
87
+ # }, {
88
+ # "time_scale" => "LAST_WEEK",
89
+ # "title" => "Sleep Depth",
90
+ # "data_type" => "PERCENTS",
91
+ # "graph_type" => "BUBBLES",
92
+ # "min_value" => 0.0,
93
+ # "max_value" => 1.0,
94
+ # "sections" => [{
95
+ # "values" => [0.068022884, 0.5591227, 0.3728544],
96
+ # "titles" => ["LIGHT", "MEDIUM", "DEEP"],
97
+ # "highlighted_values" => [],
98
+ # "highlighted_title" => nil
99
+ # }],
100
+ # "condition_ranges" => [],
101
+ # "annotations" => []
102
+ # }]
103
+ # }
104
+
105
+ def trends(timescale)
106
+ get("/v2/trends/#{timescale}")
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sense
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,197 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hello-sense
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jordan Cole
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: byebug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '9.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 9.0.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '9.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 9.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '11.0'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 11.0.0
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '11.0'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 11.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec-core
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3.6'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.6.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.6'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 3.6.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: rspec-expectations
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '3.6'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.6.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.6'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 3.6.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: rubocop
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.48'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.48.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.48'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 0.48.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: yard
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.9'
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 0.9.0
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '0.9'
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.9.0
133
+ description: Ruby implementation of Sense's private API
134
+ email:
135
+ - stilist@ratafia.info
136
+ executables: []
137
+ extensions: []
138
+ extra_rdoc_files: []
139
+ files:
140
+ - CHANGELOG.md
141
+ - CONTRIBUTING.md
142
+ - LICENSE
143
+ - README.md
144
+ - hello_sense.gemspec
145
+ - lib/hello_sense.rb
146
+ - lib/hello_sense/account.rb
147
+ - lib/hello_sense/alarms.rb
148
+ - lib/hello_sense/alerts.rb
149
+ - lib/hello_sense/api_error.rb
150
+ - lib/hello_sense/app.rb
151
+ - lib/hello_sense/client.rb
152
+ - lib/hello_sense/constants.rb
153
+ - lib/hello_sense/devices.rb
154
+ - lib/hello_sense/expansions.rb
155
+ - lib/hello_sense/firmware.rb
156
+ - lib/hello_sense/insights.rb
157
+ - lib/hello_sense/notifications.rb
158
+ - lib/hello_sense/questions.rb
159
+ - lib/hello_sense/sensors.rb
160
+ - lib/hello_sense/session.rb
161
+ - lib/hello_sense/sharing.rb
162
+ - lib/hello_sense/sleep_sounds.rb
163
+ - lib/hello_sense/speech.rb
164
+ - lib/hello_sense/stats.rb
165
+ - lib/hello_sense/store.rb
166
+ - lib/hello_sense/support.rb
167
+ - lib/hello_sense/timeline.rb
168
+ - lib/hello_sense/trends.rb
169
+ - lib/hello_sense/version.rb
170
+ homepage: https://github.com/stilist/hello-sense
171
+ licenses: []
172
+ metadata:
173
+ yard.run: yri
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 2.3.0
183
+ - - "<"
184
+ - !ruby/object:Gem::Version
185
+ version: 2.5.0
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements: []
192
+ rubyforge_project:
193
+ rubygems_version: 2.6.8
194
+ signing_key:
195
+ specification_version: 4
196
+ summary: TK
197
+ test_files: []