Pedometer#

The iPhone 5S has a built-in pedometer which we’ve leveraged into OwnTracks (iOS only). The way this works is that the iPhone counts the steps you take, and OwnTracks can report these in a JSON payload upon request.

Command#

In order for the app to actually report the steps counted by the device, you send it a specially formatted command. (The device does not periodically publish steps on its own -- you must trigger it.)

mosquitto_pub -q 2 -t owntracks/jj/5s/cmd -m '{"_type" : "cmd", "action": "reportSteps"}'

Note how we’re using QoS=2 here: the message is published to the MQTT broker, and when the phone next wakes up, which happens every few hundred seconds, it will obtain the message, and publish a JSON payload with the counted steps back to your MQTT broker.

{
    "_type": "steps", 
    "from": 1400455130, 
    "steps": 1234, 
    "to": 1400458000, 
    "tst": 1400455130
}

Daily reports#

We use the following small program to issue the JSON needed to request the steps for the 00:00 - 23:59 time-frame of this particular day (or the day before, etc.)

#!/usr/bin/env python

import datetime
import time
import json
import sys

days = 0

def unix_epoch(t, delta):
    dt = t + delta

    # print dt
    return int(time.mktime(dt.timetuple()))

now = datetime.datetime.today()

f = now.replace(now.year, now.month, now.day, 0, 0, 1, 0)
t = now.replace(now.year, now.month, now.day, 23, 59, 59, 0)

delta = datetime.timedelta(days=days)


payload = {
        '_type' : 'cmd',
        'action' : 'reportSteps',
        'from'  : unix_epoch(f, delta),
        'to'    : unix_epoch(t, delta),
}
print json.dumps(payload)

In the evening, a cron entry sends that off to our broker which will, eventually, deliver the message to the the phone.

50 22 * * * /usr/local/bin/reportsteps | mosquitto_pub -q 2 -t owntracks/jpm/5s/cmd -l

Daily reports with Openhab#

With openhab it's quite easy to user rules engine from openhab and to not rely on servers crontab.

At first you have to define mqtt retain broker (MQTT v. 1 is used) - simply add configuration to /etc/openhab2/services/mqtt.cfg

mqtt-retain.url=tcp://192.168.1.1:1884
mqtt-retain.qos=2

After that make a simple rule in /etc/openhab2/rules/ directory. Lets say the filename is /etc/openhab2/rules/owntracks.rules with contents:

rule "MQTT_OWNTRACKS_STEPS"
when
    // every day at 23:59
    Time cron "0 59 23 * * ? *"
then
    val long from1 = DateTime.now().withTimeAtStartOfDay().millis / 1000
    val long to1 = (now.millis / 1000)
    publish("mqtt-retain","owntracks/jj/5s/cmd",'{"action": "reportSteps", "to": '+ to1 +', "_type": "cmd", "from": '+ from1 +'}')
end

For usage the info in sitemaps or anywhere else 1 more item has to be made into file /etc/openhab2/items/owntracks.items

Number Steps_Yesterday "[%d]"  { mqtt="<[mqtt:owntracks/jj/5s/step:state:JSONPATH($.steps)]" }

Now You can make use of yesterday's steps count.