wiscale 0.1.0 → 0.2.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.
- data/README.rdoc +44 -0
- data/VERSION +1 -1
- data/credentials.yml.example +4 -2
- data/lib/wiscale.rb +63 -0
- data/test/test_wiscale.rb +22 -0
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -2,6 +2,50 @@
|
|
2
2
|
|
3
3
|
Ruby Wrapper for Withings Wifi Scale API
|
4
4
|
|
5
|
+
== INSTALL:
|
6
|
+
sudo gem install wiscale
|
7
|
+
|
8
|
+
== SYNOPSIS:
|
9
|
+
|
10
|
+
Setup:
|
11
|
+
require 'wiscale'
|
12
|
+
client = WiScale.new(:userid => 123, :publickey => 'asdlkfja')
|
13
|
+
|
14
|
+
Get all measurements without any filters:
|
15
|
+
measurements = client.get_meas
|
16
|
+
|
17
|
+
Get only the last measurement:
|
18
|
+
measurements = client.get_meas(:limit => 1)
|
19
|
+
|
20
|
+
Get the last measurement as weight in lbs and %fat:
|
21
|
+
measurements[0].each do |rec|
|
22
|
+
type = rec['type'].to_i
|
23
|
+
value = (rec['value'].to_i * (10 ** rec['unit'])).to_f
|
24
|
+
|
25
|
+
if type == 6
|
26
|
+
puts "Fat %: " + value.round(2)
|
27
|
+
elsif type == 1
|
28
|
+
puts "Weight " + (value * 2.20462262).round(2) + " lb"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Subscribe a URL to push notification:
|
33
|
+
client.notify_subscribe('http://www.mytestingurl.com', 'this is a test')
|
34
|
+
|
35
|
+
Get the notification you just created:
|
36
|
+
client.notify_get('http://www.mytestingurl.com')
|
37
|
+
|
38
|
+
Revoke the notification:
|
39
|
+
client.notify_revoke('http://www.mytestingurl.com')
|
40
|
+
|
41
|
+
|
42
|
+
Get all user information:
|
43
|
+
client.get_by_userid
|
44
|
+
|
45
|
+
Get a list of users for a logon:
|
46
|
+
WiScale.get_users_list('myemail@address.com', 'mywithingspassword')
|
47
|
+
|
48
|
+
|
5
49
|
== Note on Patches/Pull Requests
|
6
50
|
|
7
51
|
* Fork the project.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/credentials.yml.example
CHANGED
data/lib/wiscale.rb
CHANGED
@@ -112,6 +112,65 @@ class WiScale
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
+
def scale_once()
|
116
|
+
ret_val = JSON.parse(HTTParty.get(scale_url + '/once', :query => {:action => 'get'}))
|
117
|
+
return ret_val['body']['once']
|
118
|
+
end
|
119
|
+
|
120
|
+
def compute_scale_hash(mac, secret)
|
121
|
+
once = scale_once
|
122
|
+
hash = mac + ':' + secret + ':' + once
|
123
|
+
|
124
|
+
Digest::MD5::hexdigest(hash)
|
125
|
+
end
|
126
|
+
|
127
|
+
def session_start(email, secret, mac)
|
128
|
+
hash = compute_scale_hash(mac, secret)
|
129
|
+
|
130
|
+
ret_val = JSON.parse(HTTParty.get(scale_url + '/session', :query => {:action => 'new', :auth => mac, :duration => '30', :hash => hash}))
|
131
|
+
|
132
|
+
if ret_val['status'] == 0
|
133
|
+
ret_val['body']['sessionid']
|
134
|
+
else
|
135
|
+
ret_val['status']
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
def session_delete(sessionid)
|
141
|
+
ret_val = JSON.parse(HTTParty.get(scale_url + '/session', :query => {:action => 'delete', :sessionid => sessionid}))
|
142
|
+
ret_val['status']
|
143
|
+
end
|
144
|
+
|
145
|
+
# Create a new measurements record for the user
|
146
|
+
# * email address of account owner
|
147
|
+
# * secret password of scale masquerading as
|
148
|
+
# * mac address of scale masquerading as
|
149
|
+
# * timestamp (epoch time) of measurement recording
|
150
|
+
# * weight value (in kg) of measurement
|
151
|
+
# * percent body fat of measurement
|
152
|
+
def meas_create(email, secret, mac, timestamp, weight, bodyfat)
|
153
|
+
session = session_start(email, secret, mac)
|
154
|
+
|
155
|
+
bfmass = (weight*bodyfat*10).to_i
|
156
|
+
weight = weight * 1000
|
157
|
+
|
158
|
+
meas_string = "{\"measures\":[{\"value\":'#{weight}',\"type\":1,\"unit\":-3},{\"value\":'#{bfmass}',\"type\":8,\"unit\":-3}]}"
|
159
|
+
|
160
|
+
ret_val = JSON.parse(HTTParty.get(scale_url + '/measure', :query => {
|
161
|
+
:action => 'store',
|
162
|
+
:sessionid => session,
|
163
|
+
:userid => userid,
|
164
|
+
:macaddress => mac,
|
165
|
+
:meastime => timestamp,
|
166
|
+
:devtype => '1',
|
167
|
+
:attribstatus => '0',
|
168
|
+
:measures => meas_string
|
169
|
+
}))
|
170
|
+
|
171
|
+
ret_val
|
172
|
+
end
|
173
|
+
|
115
174
|
def compute_hash(email, passwd)
|
116
175
|
once = get_once
|
117
176
|
hash = email + ':' + Digest::MD5::hexdigest(passwd) + ':' + once
|
@@ -123,6 +182,10 @@ class WiScale
|
|
123
182
|
@api_url || @api_url = 'http://wbsapi.withings.net'
|
124
183
|
end
|
125
184
|
|
185
|
+
def scale_url
|
186
|
+
@scale_url || @scale_url = 'http://scalews.withings.net/cgi-bin'
|
187
|
+
end
|
188
|
+
|
126
189
|
def userid
|
127
190
|
@userid
|
128
191
|
end
|
data/test/test_wiscale.rb
CHANGED
@@ -64,4 +64,26 @@ class TestWiscaleRuby < Test::Unit::TestCase
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
context "sessions" do
|
68
|
+
should "start and end session" do
|
69
|
+
config = YAML.load_file("credentials.yml")
|
70
|
+
client = WiScale.new()
|
71
|
+
|
72
|
+
sessionid = client.session_start('jon@digital-drip.com', config['secret'], config['mac'])
|
73
|
+
assert_equal 0, client.session_delete(sessionid)
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "create measurement" do
|
79
|
+
should "create a new measurement" do
|
80
|
+
config = YAML.load_file("credentials.yml")
|
81
|
+
client = WiScale.new(:userid => config['userid'], :publickey => config['publickey'])
|
82
|
+
|
83
|
+
ret_val = client.meas_create(config['email'], config['secret'], config['mac'], Time.now.to_i, 100, 50)
|
84
|
+
p 'got return val of: ' + ret_val.inspect
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
67
88
|
end
|
89
|
+
|