openmhealth / shimmer Goto Github PK
View Code? Open in Web Editor NEWAn application for reading health data from third-party APIs.
License: Apache License 2.0
An application for reading health data from third-party APIs.
License: Apache License 2.0
Jawbone's documentation says
IMPORTANT: All communication should be done over a secure channel (SSL). HTTPS redirect uri is a requirement for authentication when an app is published.
This is not currently enforced, but if it were, it would prevent authorization from working when the redirect URL points directly to a Shimmer container running without TLS. While this shouldn't be a problem in production (since the redirect would point to the application and not directly to Shimmer), it will get in the way of testing if enforced.
Since using a self-signed certificate could also hurt the user experience, it would be good to add TLS support using free Let's Encrypt certificates.
Although 1.0a support has been extended to August, "[no new OAuth 1.0a client credentials will be issued](no new OAuth 1.0a client credentials will be issued)" as of this week.
"the screen to create new users is a tad unintuitive. The text box placeholder text ‘Enter a unique identifier’ in conjunction with a button reading ‘Find’ left me a bit confused. I would expect it to mention adding a new user, etc."
We could also add copy to clarify what the text box and button do.
The bod/log/weight
endpoint supports the retrieval of BMI data for multiple days, but Shimmer is requesting a day at a time, with repercussions on rate limits and performance.
Shimmer should leverage range queries to optimise the retrieval of BMI data.
Hello,
I don't understand why Shimmer doesn't support Fitbit API of heart rate. It support heart rate call of Google Fit, Withings, Jawbone...
What should I do to add that call?
Thanks
Hi
I am from windows & .Net world so having issues getting this running. I am able to build the code locally and get the "started application" message but when look at http://localhost:8083/
it gives whitelable error page mentioning "There was an unexpected error (type=Not Found, status=404). ". Attaching the log file
I also tried taking the war file created and deploying on tomcat. However got below error in log
INFO: validateJarFile(D:\apache-tomcat-7.0.47\webapps\shimmer-new\WEB-INF\lib\javax.el-3.0.0.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
Based on some forums it looks to be issue related to dependencies. Tried to change the build.gradle but no use.
shimmer.zip
Hello!
I'm trying out shimmer locally, and I noticed that there seems to be no authorization on the /data request: once a the shim-server has acquired the OAuth access token for a given username, it will happily give out data to anyone who requests it.
This is perfectly fine if shimmer is meant to be used behind a closed firewall, so that only the real application server can touch shimmer. But that does not work if shimmer controls the OAuth authorization flow on its own: the user must be able to access the authorize callback with the browser.
This is also fine if the username is used as a secret bearer token. But the name username, and the fact it appears in plain in the URL suggests that it is not a secret value, and in the security model of the web I'm afraid it makes it more risky (for example, it becomes visible to Referrer headers).
So what's the expected security model? How should I configure shimmer in a way that noone can access data that it does not own in the first place?
If I submit a query as follows:
http://shimserver:8083/data/withings/body?username=nosh&dateStart=2015-01-01&dateEnd=2015-05-15&normalize=true
I should get all readings from Jan 1, 2015 to May 15, 2015. However, I seem to get readings than span only about 2 months
If I then submit the query
http://shimserver:8083/data/withings/body?username=nosh&dateStart=2015-01-01&dateEnd=2015-02-15&normalize=true
i.e. readings from Feb 15 to January 1, then I get some more readings (within the specified time range)- which shows that there are readings that were not retrieved by the first query, even though the time ranges overlap
Response from Emerson on mailing list:
I've just checked the Withings shim, and it's passing those parameters to the Withings API verbatim. Some other shims truncate the range because of API limits, but the Withings shim isn't one of them.
re: pagination feedback, it doesn't look like Withings provides the 'more' value unless 'limit' is being used. But if we assume that "Results are always sorted from the most recent one first to the oldest one" is true even when not specifying a limit, you could theoretically ask for time ranges in reverse chronological order; make a call for a big range that ends now, then the next call's range would end at the time of the oldest data point in the first response. It's a hack, but could work.
The better way to fix this is to hook up the pagination information in ShimDataRequest to the Withings shim, and handling the 'more' response field
Having two build systems adds complexity. Since the Gradle wrapper can download Gradle for anyone who doesn't have it, and since Gradle is gaining adoption and is more flexible, we should drop Maven.
Hi,
I am building an Android mobile application that makes use of the open mHealth's normalised health data collected from the third party APIs. For the authorization process, the application makes a call to the open mHealth's shimmer server. However, when authorizing a user from the android device, I came to understand that there are some issues in accessing the open mHealth application from the outside internet.
I would like to know the correct way of accessing the open mHealth application(residing in the docker containers) from the outside internet. I am posting this query here so that I can get the help of the experts who have already tried this approach of authorizing users in omh server through Android application.
Not sure whether anyone else has run into this issue, but when normalized activity data is requested using the Fitbit API, I receive this response:
{
"shim": "fitbit",
"timeStamp": 1448141592,
"body": []
}
This is the only endpoint where I'm having this issue.
Hi,
On this page http://www.openmhealth.org/documentation/#/data-providers/data-provider-api-library/providers/fitbit - you mention the FitBit API Shim schema ID that are supported as follows (SEE ATTACHED IMAGE FITBIT_0) -
Available Metrics
Blood glucose omh:blood-glucose:1.0
Blood pressure omh:blood-pressure:1.0
Body weight omh:body-weight:1.0
Heart rate omh:heart-rate:1.0
Physical activity omh:physical-activity:1.0
Step count omh:step-count:1.0
But on this page - https://github.com/openmhealth/shimmer#reading-data - you only mention the following FitBit Supported APIs and endpoints - (SEE ATTACHED IMAGE FITBIT_1) -
fitbit1 activity omh:physical-activity
fitbit1 steps omh:step-count
fitbit1 weight omh:body-weight
fitbit1 body_mass_index omh:body-mass-index
fitbit1 sleep omh:sleep-duration
I am interested to get FitBit Blood pressure omh:blood-pressure:1.0 data. Is it possible? The above 2 pages show discrepancy in what is possible. Please clarify?
Thanks
NK
The data coming from the RunKeeper API is in the local timezone of the user, not in UTC. A bike ride I went on in CEST (UTC+2) has this raw data
{
"duration" : 1686.535,
"total_distance" : 8185.34414335005,
"has_path" : true,
"entry_mode" : "API",
"source" : "RunKeeper",
"start_time" : "Sun, 7 Sep 2014 19:08:43",
"total_calories" : 159,
"type" : "Cycling",
"uri" : "/fitnessActivities/429860882"
}
and this normalised physical activity
{
"activity_name" : "Cycling",
"distance" : {
"value" : 8185.344143350050217122770845890045166015625,
"unit" : "m"
},
"effective_time_frame" : {
"time_interval" : {
"start_time" : "2014-09-07T19:08:43.000Z",
"duration" : {
"value" : 1686.535000000000081854523159563541412353515625,
"unit" : "sec"
}
}
}
}
Hi,
I want to run the shimmer under an existing tomcat server so I would like to have the shimmer available as a war.
I found this: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/build-tool-plugins-gradle-plugin.html#build-tool-plugins-gradle-packaging and http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file
I have no experience with spring, but it sounds like it should be possible to create a war containing the shimmer and also have the jar with the embedded jetty.
What do you think?
We setup shimmer docker image (latest) on AWS. Created iHealth application on sandbox. Added Client ID and Client Secret in "Settings" (UI) and /shimmer/shim-server/src/main/resources/application.yaml updated with SC & SV values.
When requesting to "Connect", it's giving NetworkError: 500 Server Error as below,
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Apr 01 08:52:59 UTC 2016
There was an unexpected error (type=Internal Server Error, status=500).
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
pom.xml and build.gradle should both be on the same Spring Boot version and pulling in the same dependencies.
Hi there,
I tried to setup the shim for some experiment and it's placed on AWS as docker. The console looks fine and credential was set, but the authorization process seems failed and the popup dialog showed:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Feb 19 10:55:17 UTC 2016
There was an unexpected error (type=Internal Server Error, status=500).
org.springframework.web.util.NestedServletException:
Request processing failed; nested exception is
org.springframework.web.client.HttpClientErrorException: 403 Forbidden
And here is the error log from resource server.
Is is possible that the credential was created with incorrect information, something missed while setting the resource server or any other step I ignored? Thanks.
This is happening in the RunKeeper shim. The schema only allows one of the two fields.
"effective_time_frame": {
"date_time": "2014-09-07T16:19:50.000Z",
"time_interval": {
"start_time": "2014-09-07T16:19:50.000Z",
"duration": {
"value": 1730.072,
"unit": "sec"
}
}
}
Hello,
have you an OpenAPI Specification or RAML file to describe your API?
Thanks,
Stefano
I have successfully set up fitbit and Withings.
I've setup iHealth as far as I know but when I click on iHealth in the shimmer UI nothing happens.
Is there a way to debug i.e. see what happens after iHealth is clicked.
Any suggestions?
I've edited Application.yaml as follows:
spring:
application:
name: Shimmer
data:
mongodb:
uri: mongodb://mongo:27017/omh_dsu
jackson:
serialization:
indent_output: true
server:
port: 8083
security:
basic:
enabled: false
logging:
file: shimmer.log
openmhealth:
shim:
server:
callbackUrlBase: http://my.URL.com:8083 # I've tried this and the original localhost
#NOTE: Uncomment and fill in the clientId/clientSecret with your credentials if you're not using the UI
#NOTE: Uncomment and set partnerAccess to true if your credentials for a given API have partner access
#NOTE: Uncomment and fill in your serialValues for iHealth, otherwise the iHealth shim will not work correctly
ihealth:
serialValues:
SC: SCxxx
sportSV: SV1
bloodPressureSV: SV2
spo2SV: SV3
weightSV: SV4
bloodGlucoseSV: SV5
activitySV: SV6
sleepSV: SV7
clientId: cID # I've tried with and without
clientSecret: cS # I've tried with and without
#fitbit:
# partnerAccess: true
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
#fatsecret:
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
#jawbone:
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
#misfit:
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
#runkeeper:
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
#withings:
# partnerAccess: true
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
#healthvault:
# clientId: [YOUR_CLIENT_ID]
#googlefit:
# clientId: [YOUR_CLIENT_ID]
# clientSecret: [YOUR_CLIENT_SECRET]
Hi,
working from a local machine when I connect to google fit I get the error:
Error: invalid_request
device_id and device_name are required for private IP: http://192.168.99.101:8083/authorize/googlefit/callback
Am i doing something wrong?
thank you
I'm currently running a test Shimmer session via docker on a Digital Ocean Droplet and am running into the following authentication error:
"The app you're trying to connect did not provide valid information to Fitbit. Please report the issue to them. Developer information: invalid_request - Invalid redirect_uri parameter value"
Please let me know what additional info you need to help debug. Thx!
Hi,
I am trying to authorize the access of Runkeeper app programmatically. I have created an application in the Runkeeper developers page and have my client ID, client secret keys. I am able to access the user's runkeeper data through the omh console dashboard. However, I want to authorize
the users programatically. Hence, as mentioned in the gitHub shimmer documentation page, I tried to make a GET request to the below URL by substituting the host address of my docker machine :
http://:8083/authorize/{shim}?username={userId}
The following is the returned JSON response:
{
"id": "57481440e4b04af925c1e49b",
"stateKey": null,
"username": "test",
"redirectUri": null,
"requestParams": null,
"authorizationUrl": null,
"clientRedirectUrl": null,
"isAuthorized": true,
"serializedRequest": null
}
I tried it in the browser and in the postman plugin and both returned the 'null' value for the 'authorizationUrl' key. Can anyone help by letting me know whether the approach I follow is right ? Or am I missing something .?
Thanks.
The project doesn't build unless the MS HealthVault libraries are installed. The documentation should be updated accordingly.
Are there any plans on integrating support for the Microsoft Health platform? The company I work for is interested in this integration. We are also looking into contributing a shim for this integration, if nothing exists yet. If so, are there any pitfalls, known issues with the Microsoft Health platform or contribution guidelines that could be useful for us to be aware of?
Hi,
My problem statement is to incentivize users based on their fitness data collected from a wide variety of sources.
The real problem: "Each of these sources have a varying level of accuracy. The same user has reported different step count on multiple apps. Likewise 2 users walking the same number of steps have different multiple readings on different sources"
How do we deal with this situation? Appreciate your help.
Thanks.
I get this error in the pop-up
Sorry, we are unable to process the request.
Error code: invalid_redirect
If you are building your own docker image (option 3), line 35 of the Dockerfile uses curl to fetch the Healthvault Java Lib. However, the URL is no longer valid, and returns an HTML file sending you to:
http://healthvaultjavalib.codeplex.com/downloads/get/878881
If you try the curl to that address, it still fails. A similar issue was discussed here, but I was not able to get that to work.
As a work around, I just downloaded the .zip file to the /docker/source directory, and then had the Dockerfile copy it to the container while building:
COPY ./healthvault-sdk-1.6.0.zip /root/healthvault-sdk-1.6.0.zip
This will serve as a base image for a leaner shim server container.
Option 2. Building from source and running on your host system
...
$ cd shim-server-ui/
$ npm install
npm WARN package.json [email protected] No description
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No README data
npm WARN deprecated [email protected]: use grunt-ng-annotate instead
npm WARN deprecated [email protected]: use ng-annotate instead
npm WARN deprecated [email protected]: Use the globby package instead
[email protected] install /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/karma/node_modules/chokidar/node_modules/fsevents
node-gyp rebuild
child_process: customFds option is deprecated, use stdio instead.
SOLINK_MODULE(target) Release/.node
SOLINK_MODULE(target) Release/.node: Finished
CXX(target) Release/obj.target/fse/fsevents.o
SOLINK_MODULE(target) Release/fse.node
SOLINK_MODULE(target) Release/fse.node: Finished
[email protected] postinstall /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/grunt-autoprefixer
[email protected] install /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws
(node-gyp rebuild 2> builderror.log) || (exit 0)
CXX(target) Release/obj.target/bufferutil/src/bufferutil.o
SOLINK_MODULE(target) Release/bufferutil.node
SOLINK_MODULE(target) Release/bufferutil.node: Finished
CXX(target) Release/obj.target/validation/src/validation.o
SOLINK_MODULE(target) Release/validation.node
SOLINK_MODULE(target) Release/validation.node: Finished
[email protected] install /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/karma-phantomjs-launcher/node_modules/phantomjs
node install.js
Downloading https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-macosx.zip
Saving to /var/folders/g9/93n9wtsd3g7fjkh63dm2n57c0000gp/T/phantomjs/phantomjs-1.9.8-macosx.zip
Receiving...
[=================================-------] 83% 0.0s
Received 9187K total.
Extracting zip contents
Removing /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom
Copying extracted folder /var/folders/g9/93n9wtsd3g7fjkh63dm2n57c0000gp/T/phantomjs/phantomjs-1.9.8-macosx.zip-extract-1435610996537/phantomjs-1.9.8-macosx -> /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom
Writing location.js file
Done. Phantomjs binary available at /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom/bin/phantomjs
[email protected] postinstall /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/grunt-contrib-imagemin/node_modules/gifsicle
node index.js
✔ pre-build test passed successfully!
[email protected] postinstall /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/grunt-contrib-imagemin/node_modules/jpegtran-bin
node index.js
✔ pre-build test passed successfully!
[email protected] postinstall /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/grunt-contrib-imagemin/node_modules/optipng-bin
node index.js
✔ pre-build test passed successfully!
[email protected] postinstall /Users/alan_cooper/Documents/GitHub/AperitasCloud/openmhealth/shimmer/shim-server-ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin
node index.js
✓ pre-build test passed successfully
[email protected] node_modules/grunt-rev
[email protected] node_modules/karma-jasmine
[email protected] node_modules/grunt-text-replace
[email protected] node_modules/grunt-contrib-concat
[email protected] node_modules/grunt-contrib-copy
[email protected] node_modules/grunt-contrib-clean
└── [email protected]
[email protected] node_modules/grunt-concurrent
├── [email protected]
└── [email protected] ([email protected])
[email protected] node_modules/grunt-contrib-htmlmin
├── [email protected]
└── [email protected] ([email protected])
[email protected] node_modules/grunt-newer
├── [email protected]
└── [email protected] ([email protected])
[email protected] node_modules/grunt-contrib-cssmin
├── [email protected] ([email protected])
└── [email protected] ([email protected])
[email protected] node_modules/grunt-connect-proxy
├── [email protected]
└── [email protected] ([email protected])
[email protected] node_modules/jshint-stylish
├── [email protected]
└── [email protected] ([email protected], [email protected], [email protected])
[email protected] node_modules/time-grunt
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected]
└── [email protected]
[email protected] node_modules/grunt-karma
└── [email protected]
[email protected] node_modules/load-grunt-tasks
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected])
[email protected] node_modules/grunt-usemin
├── [email protected]
└── [email protected]
[email protected] node_modules/grunt-contrib-jshint
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-contrib-uglify
├── [email protected] ([email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-ngmin
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-contrib-connect
├── [email protected]
├── [email protected]
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-bower-install
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-svgmin
├── [email protected]
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-contrib-watch
├── [email protected] ([email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected]
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected])
[email protected] node_modules/grunt-google-cdn
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-autoprefixer
└── [email protected] ([email protected], [email protected])
[email protected] node_modules/karma
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/karma-phantomjs-launcher
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
[email protected] node_modules/grunt-contrib-imagemin
├── [email protected]
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected])
$ cd ../shim-server-ui/
Alan-Cooper-MBP:shim-server-ui alan_cooper$ sudo npm install -g grunt-cli bower
Password:
/usr/local/bin/grunt -> /usr/local/lib/node_modules/grunt-cli/bin/grunt
/usr/local/bin/bower -> /usr/local/lib/node_modules/bower/bin/bower
[email protected] /usr/local/lib/node_modules/grunt-cli
├── [email protected] ([email protected])
├── [email protected]
└── [email protected] ([email protected], [email protected])
[email protected] /usr/local/lib/node_modules/bower
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected])
$ bower install
? May bower anonymously report usage statistics to improve the tool over time? Yes
bower not-cached git://github.com/moment/moment.git#~2.8.3
bower resolve git://github.com/moment/moment.git#~2.8.3
bower not-cached git://github.com/jquery/jquery.git#~1.11.0
bower resolve git://github.com/jquery/jquery.git#~1.11.0
bower not-cached git://github.com/angular/bower-angular.git#1.2.15
bower resolve git://github.com/angular/bower-angular.git#1.2.15
bower not-cached git://github.com/es-shims/es5-shim.git#~2.1.0
bower resolve git://github.com/es-shims/es5-shim.git#~2.1.0
bower not-cached git://github.com/angular/bower-angular-resource.git#1.2.15
bower resolve git://github.com/angular/bower-angular-resource.git#1.2.15
bower not-cached git://github.com/angular/bower-angular-cookies.git#1.2.15
bower resolve git://github.com/angular/bower-angular-cookies.git#1.2.15
bower not-cached git://github.com/angular/bower-angular-sanitize.git#1.2.15
bower resolve git://github.com/angular/bower-angular-sanitize.git#1.2.15
bower not-cached git://github.com/angular/bower-angular-scenario.git#1.2.15
bower resolve git://github.com/angular/bower-angular-scenario.git#1.2.15
bower not-cached git://github.com/angular-ui/ui-date.git#~0.0.4
bower resolve git://github.com/angular-ui/ui-date.git#~0.0.4
bower not-cached git://github.com/angular/bower-angular-route.git#1.2.15
bower resolve git://github.com/angular/bower-angular-route.git#1.2.15
bower not-cached git://github.com/angular/bower-angular-mocks.git#1.2.15
bower resolve git://github.com/angular/bower-angular-mocks.git#1.2.15
bower not-cached git://github.com/bestiejs/json3.git#~3.2.6
bower resolve git://github.com/bestiejs/json3.git#~3.2.6
bower not-cached git://github.com/twbs/bootstrap.git#~3.0.3
bower resolve git://github.com/twbs/bootstrap.git#~3.0.3
bower download https://github.com/angular-ui/ui-date/archive/0.0.8.tar.gz
bower download https://github.com/es-shims/es5-shim/archive/v2.1.0.tar.gz
bower download https://github.com/moment/moment/archive/2.8.4.tar.gz
bower download https://github.com/angular/bower-angular-scenario/archive/v1.2.15.tar.gz
bower download https://github.com/jquery/jquery/archive/1.11.3.tar.gz
bower download https://github.com/angular/bower-angular-route/archive/v1.2.15.tar.gz
bower download https://github.com/angular/bower-angular/archive/v1.2.15.tar.gz
bower download https://github.com/bestiejs/json3/archive/v3.2.6.tar.gz
bower download https://github.com/angular/bower-angular-cookies/archive/v1.2.15.tar.gz
bower download https://github.com/angular/bower-angular-resource/archive/v1.2.15.tar.gz
bower download https://github.com/angular/bower-angular-mocks/archive/v1.2.15.tar.gz
bower download https://github.com/angular/bower-angular-sanitize/archive/v1.2.15.tar.gz
bower extract angular-ui-date#~0.0.4 archive.tar.gz
bower resolved git://github.com/angular-ui/ui-date.git#0.0.8
bower download https://github.com/twbs/bootstrap/archive/v3.0.3.tar.gz
bower extract es5-shim#~2.1.0 archive.tar.gz
bower invalid-meta es5-shim is missing "main" entry in bower.json
bower invalid-meta es5-shim is missing "ignore" entry in bower.json
bower resolved git://github.com/es-shims/es5-shim.git#2.1.0
bower not-cached git://github.com/components/jqueryui.git#^1.9
bower resolve git://github.com/components/jqueryui.git#^1.9
bower extract angular-route#1.2.15 archive.tar.gz
bower invalid-meta angular-route is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular-route.git#1.2.15
bower extract angular-cookies#1.2.15 archive.tar.gz
bower extract angular-resource#1.2.15 archive.tar.gz
bower invalid-meta angular-cookies is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular-cookies.git#1.2.15
bower invalid-meta angular-resource is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular-resource.git#1.2.15
bower download https://github.com/components/jqueryui/archive/1.11.4.tar.gz
bower extract momentjs#~2.8.3 archive.tar.gz
bower extract angular-scenario#1.2.15 archive.tar.gz
bower extract angular-sanitize#1.2.15 archive.tar.gz
bower invalid-meta angular-sanitize is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular-sanitize.git#1.2.15
bower invalid-meta angular-scenario is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular-scenario.git#1.2.15
bower extract jquery#~1.11.0 archive.tar.gz
bower resolved git://github.com/moment/moment.git#2.8.4
bower extract angular#1.2.15 archive.tar.gz
bower invalid-meta angular is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular.git#1.2.15
bower extract angular-mocks#1.2.15 archive.tar.gz
bower invalid-meta angular-mocks is missing "ignore" entry in bower.json
bower resolved git://github.com/angular/bower-angular-mocks.git#1.2.15
bower resolved git://github.com/jquery/jquery.git#1.11.3
bower extract bootstrap#~3.0.3 archive.tar.gz
bower resolved git://github.com/twbs/bootstrap.git#3.0.3
bower extract jquery-ui#^1.9 archive.tar.gz
bower resolved git://github.com/components/jqueryui.git#1.11.4
bower extract json3#~3.2.6 archive.tar.gz
bower resolved git://github.com/bestiejs/json3.git#3.2.6
bower install angular-ui-date#0.0.8
bower install es5-shim#2.1.0
bower install angular-route#1.2.15
bower install angular-cookies#1.2.15
bower install angular-resource#1.2.15
bower install angular-sanitize#1.2.15
bower install angular-scenario#1.2.15
bower install momentjs#2.8.4
bower install angular#1.2.15
bower install angular-mocks#1.2.15
bower install jquery#1.11.3
bower install bootstrap#3.0.3
bower install jquery-ui#1.11.4
bower install json3#3.2.6
angular-ui-date#0.0.8 app/bower_components/angular-ui-date
├── angular#1.2.15
└── jquery-ui#1.11.4
es5-shim#2.1.0 app/bower_components/es5-shim
angular-route#1.2.15 app/bower_components/angular-route
└── angular#1.2.15
angular-cookies#1.2.15 app/bower_components/angular-cookies
└── angular#1.2.15
angular-resource#1.2.15 app/bower_components/angular-resource
└── angular#1.2.15
angular-sanitize#1.2.15 app/bower_components/angular-sanitize
└── angular#1.2.15
angular-scenario#1.2.15 app/bower_components/angular-scenario
└── angular#1.2.15
momentjs#2.8.4 app/bower_components/momentjs
angular#1.2.15 app/bower_components/angular
angular-mocks#1.2.15 app/bower_components/angular-mocks
└── angular#1.2.15
jquery#1.11.3 app/bower_components/jquery
bootstrap#3.0.3 app/bower_components/bootstrap
└── jquery#1.11.3
jquery-ui#1.11.4 app/bower_components/jquery-ui
└── jquery#1.11.3
json3#3.2.6 app/bower_components/json3
$ grunt build
Loading "Gruntfile.js" tasks...ERROR
TypeError: Cannot read property 'prototype' of undefined
Warning: Task "build" not found. Use --force to continue.
Aborted due to warnings.
In running Shimmer locally on a Mac:
Fitbit needs a callback URL. How can the locally running Shimmer (running within Docker in a VM) export a call back URL?
A user has to currently jump through hoops, especially with HealthVault to get the shim server up and running. A Dockerfile that automates the setup process and provides isolation from a host system would help.
Nothing happens when clicking the calendar icon. Tested in Chrome and Safari on OS X.
Hi, after setting the consumer id and secret I tried to load some data but I got an error:
2016/02/09 00:57:24 [error] 8#8: *16 open() "/usr/share/nginx/html/styles/images/ui-bg_flat_75_ffffff_40x100.png" failed (2: No such file or directory), client: 192.168.99.1, server: , request: "GET /styles/images/ui-bg_flat_75_ffffff_40x100.png HTTP/1.1", host: "192.168.99.100:8083", referrer: "http://192.168.99.100:8083/styles/64ed70ec.main.css"
I'd like to standardise on the OmH schemas for storing certain data points in an application. However, I already have a (scala) service that handles the authentication and connection side of things to various 3rd party data providers.
I've been looking at how to use the mappings from Shimmer to handle the conversions, and it seems that I'd need the omh-schema-sdk
(already available via maven), but also the common/mapper
package from the omh-shim-sdk
, together with the individual provider mapper
packages (e.g. org.openmhealth.shim.jawbone.mapper
).
This could be a common use-case, where users want to convert 3rd party data without using the full shim-server/shimmer (although this seems to have been developed much further since I last looked), and I wondered if there was any interest at your end to separate the individual shim mappings from the rest of the system.
Any feedback greatly appreciated. Thanks
It would be nice to be able to have application.yml
loaded from a (configurable) location in the filesystem.
I know I could set spring.config.location
but when running the shimmer from tomcat I want to have a different value for each application.
Something like @PropertySource
looks nice but this does not work with yaml according to the documentation.
As that's about everything I know about spring I'm not sure how to implement this. Could you provide some hints on how to externalize the configuration file.
Thanks.
I'm making a single request to shimmer for my physical activity data from FitBit. e.g. for the last 6-12 months:
http://omh-shimmer.datanosh.com:8083/data/withings/[email protected]&dateStart=2015-01-01&dateEnd=2015-12-15&normalize=true
This should only result in a few (maybe < 100 records). I seem to be frequently getting messages saying that my API limits have been expected:
There was an unexpected error (type=Internal Server Error, status=500).
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.openmhealth.shim.common.mapper.MissingJsonNodeMappingException: The required field 'activities' wasn't found in node '{"errors":[{"errorType":"request","fieldName":"n/a","message":"Rate limit exceeded for this user. Please try again at the start of the hour. More information about rate limiting is at https://dev.fitbit.com/."}],"success":false}'.
Given that the published API limits are 150 requests/hour per user, and I don't think my code is making a crazy number of requests, is it possible Shimmer is making a large number of requests to FitBit for each call to Shimmer, consequently causing it to exceed the API limits?
I've noticed an inconsistency in the results that come back from Shimmer's /authorize
endpoint.
I'm building an device authorization UI in an external app, which is what lead me to discovering this
In my case, I've gone through the oauth flow and authorized two devices/providers:
Jawbone and Fitbit
When I call http://shimmer.xxxxxx.com:8083/authorize/jawbone/?username=tp|0e5fab3f1a
(i.e. get back authorization details for jawbone) I get back this from Shimmer:
{
"id": "56292227e4b0682904230a4e",
"stateKey": null,
"username": "tp|0e5fab3f1a",
"redirectUri": null,
"requestParams": null,
"authorizationUrl": null,
"clientRedirectUrl": "oob",
"isAuthorized": true,
"serializedRequest": null
}
This is as expected - the isAuthorized
field is set to true as the the device has already been authorized.
However, when I call http://shimmer.xxxxxx.com:8083/authorize/fitbit/?username=tp|0e5fab3f1a
I get back:
{
"id": "56292336e4b0682904230a52",
"stateKey": "c19cb2bf-9303-4f97-8573-9182849d963c",
"username": "tp|0e5fab3f1a",
"redirectUri": "http://xx.xx.xx.xx:8083/authorize/fitbit/callback?state=c19cb2bf-9303-4f97-8573-9182849d963c",
"requestParams": {
"oauth_token": "699018ef6491ead4cadf682507bca5a0",
"oauth_token_secret": "6130fa167f49d2149cbec7d04cf14244"
},
"authorizationUrl": "https://www.fitbit.com/oauth/authenticate?oauth_consumer_key=1651ecdcf167d2a5928a5d243664f209&oauth_nonce=4705931066521466871&oauth_signature=3HaA0rk1cz5TgqxxRu0faHqVs44%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1445536566&oauth_token=699018ef6491ead4cadf682507bca5a0&oauth_version=1.0",
"clientRedirectUrl": "oob",
"isAuthorized": false,
"serializedRequest": null
}
This has the isAuthorized
flag set to false. This is even though the fitbit connection has been authorized.
When I call /authorizations
for that user, I get back
[
{
"auths": [
"fitbit",
"jawbone",
"runkeeper"
],
"username": "tp|0e5fab3f1a"
}
]
This leads me to believe there is something wrong with the /authorize
endpoint. I'm not sure if it is specific to the Fitbit shim or some some weird state that shimmer gets into where it thinks that the Shim is not authorized (from /authorize
) even when it is.
It looks like Maven was abandoned for Gradle only, however, the Dockerfile still uses Maven, which gives an error when building the Docker image.
Hi,
I have been trying to record the data captured with my Runkeeper application using the omh. Everything was working fine till today afternoon(02:00 PM EET, 25 May, 2016). And after that, when I tried to fetch the data using the omh dashboard, I am getting the error : "Error, could not get data from server500" .
I also tries accessing the data through URL from a custom built android application and I was not able to get the data as well. Is there any planned outage ? Is anybody else facing the same issue .?
Add MyFitnessPal Support
The response from the Fitbit steps API cannot be normalized into the Open mHealth schema when using the Fitbit API with a non-Partner API access token.
The response from Fitbit looks like this for me:
{
"activities-log-steps":[
{"dateTime":"2011-07-05","value":1433}
]
}
However, the FitbitShim.java#L340 parser expects that the activities-log-steps-intraday
key be present in the JSON object returned.
As Fitbit's wiki page points out, the Get-Intraday-Time-Series endpoint is a restricted Partner API endpoint. While it still works without being a partner, only the total steps get returned without the time breakdown.
The following warnings are causing logback to spit out debug information when the shim server starts up.
15:23:27,610 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
15:23:27,610 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:.../omh-shims/src/main/resources/logback.xml]
15:23:27,610 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:.../omh-shims/build/classes/main/logback.xml]
15:23:27,697 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
15:23:27,705 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
15:23:27,714 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
15:23:27,779 |-WARN in ch.qos.logback.core.FileAppender[FILE] - This appender no longer admits a layout as a sub-component, set an encoder instead.
15:23:27,779 |-WARN in ch.qos.logback.core.FileAppender[FILE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
15:23:27,779 |-WARN in ch.qos.logback.core.FileAppender[FILE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
The Fitbit activities endpoint does not contain all activity data.
Manually logged activities are retrieved but activities logged by trackers do not.
This is the Fitbit API being weird as stated in a post on their forum.
Shimmer could use activities/log, which does contain this information but is structured differently.
We've created Google Fit app at Google developer platform. Shimmer is hosted on AWS. When user try to connect to Google Fit, the popup appears with error,
Invalid parameter value for redirect_uri: Raw IP addresses not allowed: http://52.25.136.24:8083/authorize/googlefit/callback
At time of setting up Shimmer, we used AWS dns as http://ec2-52-25-136-24.us-west-2.compute.amazonaws.com:8083/ and no-where provided IP.
No error in docker logs.
The activities/steps
endpoint supports the retrieval of step count data for multiple days, but Shimmer is requesting a day at a time, with repercussions on rate limits and performance.
Shimmer should leverage range queries to optimise the retrieval of step count data.
I am running an instance of the shim server using Option 1 (Docker installation). The server UI is working (I can access it with http://:), I have successfully authenticated my app and fitbit through the website, and I can retrieve data through the UI and the command line.
However, I get an error on both the UI and the command line when trying to access normalized step data. The UI shows "Error, could not get data from server500"; when I attach the server shim Docker image I get
{
"timestamp" : 1415217620587,
"status" : 500,
"error" : "Internal Server Error",
"exception" : "java.lang.NullPointerException",
"message" : null,
"path" : "/data/fitbit/steps"
}
as the return value, and a big error message appended at the end of this issue. Can anybody reproduce this issue / provide some insight? Thank you!
------------ BEGIN SERVER DUMP --------------
2014-11-05 20:02:01.109 WARN 7 --- [qtp424348777-21] o.eclipse.jetty.servlet.ServletHandler :
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: null
at org.openmhealth.shim.fitbit.FitbitShim$FitbitDataType$5.deserialize(FitbitShim.java:339)
at org.openmhealth.shim.fitbit.FitbitShim$FitbitDataType$5.deserialize(FitbitShim.java:298)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2146)
at org.openmhealth.shim.fitbit.FitbitShim.getDaysData(FitbitShim.java:553)
at org.openmhealth.shim.fitbit.FitbitShim.getData(FitbitShim.java:461)
at org.openmhealth.shim.Application.data(Application.java:335)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
... 58 common frames omitted
2014-11-05 20:02:01.110 WARN 7 --- [qtp424348777-21] o.eclipse.jetty.servlet.ServletHandler : /data/fitbit/steps
java.lang.NullPointerException: null
at org.openmhealth.shim.fitbit.FitbitShim$FitbitDataType$5.deserialize(FitbitShim.java:339)
at org.openmhealth.shim.fitbit.FitbitShim$FitbitDataType$5.deserialize(FitbitShim.java:298)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2146)
at org.openmhealth.shim.fitbit.FitbitShim.getDaysData(FitbitShim.java:553)
at org.openmhealth.shim.fitbit.FitbitShim.getData(FitbitShim.java:461)
at org.openmhealth.shim.Application.data(Application.java:335)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
I am trying to get data from iHealth devices.
In the shimmer Readme.md the following footnote #2 is included in the 'Registering for Third Party API's' section:
2 You'll need to copy the iHealth SC and SV values found via the application management page into the openmhealth.shim.ihealth.serialValues map of the application.yaml file.
I cant find a serialValues map any where or a application.yaml file.
iHealth, in addition to the app Client ID and Secret also gives a number of Client ID's and Client Secrets for each of its device API but Shimmer only has one space.
Is there an updated procedure for getting data from iHealth?
Thanks.
The physical-activity-1.0.json
schema uses time-interval-1.0.json
for the effective_time_frame
property, but the code is using TimeFrame
. We need to reconcile these, until we figure out if these can all be timeframes.
The ActivityBuilderTest
has been temporarily @Ignore
d to allow builds to complete.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.