Code Monkey home page Code Monkey logo

shimmer's People

Contributors

adsouza avatar albf avatar annadph avatar danilobonilla avatar ejain avatar emersonf avatar etheriau avatar gitter-badger avatar haddadda avatar jaredsieling avatar schaefba avatar walkabilly avatar wwadge avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

shimmer's Issues

Add TLS support

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.

Update Fitbit shim to use OAuth 2.0

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.

Improve shim server UI buttons to make it more intuitive

"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.

Fitbit shim should leverage range queries for BMI data

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.

Fitbit heart rate API

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

Issue in running locally or on tomcat

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

What's the security model of shimmer?

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?

Withings shim - not returning entire dataset for time range

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

Accessing the open mHealth application inside containers from the Outside internet

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.

Supported APIs and endpoints discrepancy in documentation

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) -
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) -
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

RunKeeper timestamps need to be converted to UTC

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"
          }
        }
      }
    }

consider adding an option to build a war

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?

iHealth shim isn't loading configuration values from YAML file

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

Forbidden access while connecting Googlefit with console

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.

OpenAPI Specification

Hello,
have you an OpenAPI Specification or RAML file to describe your API?

Thanks,
Stefano

Shimmer Setup

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]

Fitbit Authentication Error Message

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!

Authorization URL returns 'null' in the JSON response

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.

Add Microsoft Health support

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?

Comparing data from multiple sources

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.

Healthvault lib zip file curl is broken, if building your own Docker image

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

grunt build Loading "Gruntfile.js" tasks...ERROR >> TypeError: Cannot read property 'prototype' of undefined

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.

Shimmer Setup

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?

Add Docker support

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.

Can not get Fitbit shim working

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"

Shim mappings as separate library

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

externalize application.yml

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.

Shimmer making large number of requests to FitBit API?

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?

Inconsistency or bug in authorize endpoint?

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.

Dockerfile still uses maven

It looks like Maven was abandoned for Gradle only, however, the Dockerfile still uses Maven, which gives an error when building the Docker image.

Issue in accessing Runkeepr data from omh

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 .?

Fitbit Steps Intraday missing for non-Partner API calls

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.

Fix logback configuration to prevent warnings on server start

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

Fitbit shim should use range queries for step data

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.

Fitbit normalized option for steps leads to NullPointerException

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)

Getting iHealth data

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.

Activity effective_time_frame doesn't match schema

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 @Ignored to allow builds to complete.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.