Skip to main content

A pluggable system to receive and transmit bluetooth events from the Tilt Hydrometer

Project description


Coverage Status PyPI version Docker Pulls

A python module and CLI to capture and emit events from your tilt hydrometer

I've been unhappy with the quality/inconsistency of what I've seen out there in terms of random scripts that capture. No tests, no pluggable emitters, hard to find, etc.

The tilt essentially broadcasts iBeacon packets to send out a uuid (which type of tilt it is), a major (the temp in F), and a minor (the specific gravity).

This will capture those whenever theyre transmitted and emit them to a backend of your choosing so that you can graph it over time asynchronously.

The Tilt supports writing to a google doc which you could use with something like IFTTT or Zapier, but this is much lighter and lets you decide how you want to push that out with a pluggable backend system.

Supported Emitters

  • stdout
  • Webhooks
    • Generic (Send to any endpoint with any type)
    • (Example below)
    • BrewersFriend (Example below)
  • InfluxDB (1.8+)
  • Datadog (dogstatsd)
  • SQLite
  • Google Sheets (experimental/advanced)
  • Prometheus (via pushgateway)


Generate Config

$ cat <<EOF >config.ini
sleep_interval = 2 # defaults to 1
gravity_offset = -0.001 # subtract 0.001 gravity
temperature_offset = 3 # add 3 degrees
logging_level = DEBUG # defaults to INFO
logfile = /var/log/foo.log # defaults to stdout

# stdout example

# This is advanced. TODO: write up how to provide an access/refresh token
refresh_token = 11111111111111111111111111
client_id =
client_secret = 1111111111111111
spreadsheet_id = 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms

# SQLite example
file = /etc/tilty/tilt.sqlite

# Generic application/json example
url =
headers = {"Content-Type": "application/json"}
payload_template = {"color": "{{ color }}", "gravity": {{ gravity }}, "mac": "{{ mac }}", "temp": {{ temp }}, "timestamp": "{{ timestamp }}"}
method = POST
delay_minutes = 1 # cause a minimum delay between webhook emits

# example
url =
headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}
payload_template = {"Color": "{{ color }}", "SG": {{ gravity }}, "Temp": {{ temp }}, "Timepoint": "{{ timestamp }}"}
method = POST

# Brewers Friend example
url =
headers = {"Content-Type": "application/x-www-form-urlencoded"}
payload_template = {"SG": {{ gravity }}, "Temp": {{ temp }}, "Color": "{{ color }}"}
method = POST

# Brewfather custom stream example
url =
headers = {"Content-Type": "application/json"}
payload_template = {"name": "Tilt {{ color }}", "gravity": {{ gravity }}, "gravity_unit": "G", "temp": {{ temp }}, "temp_unit": "F"}
method = POST

url = http://localhost:8086
verify_ssl = True # defaults to False, only used if url is https://
bucket = tilty
org = Mine
token = mytoken # if using influx cloud
token = myuser:password # if using self hosted
gravity_payload_template = gravity,color={{ color }},mac={{ mac }} sg={{ gravity }}
temperature_payload_template = temperature,color={{ color }},mac={{ mac }} temp={{ temp }}

# Note: make sure that the dd agent has DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
host =
port = 8125

url = localhost:80
gravity_gauge_name = tilty_gravity_g
temp_gauge_name = tilty_temperature_f
labels = {"color": "{{ color }}", "mac": "{{ mac }}"}
job_name = tilty


$ tilty
$ # Or from docker ( generate config into $cwd/config/config.ini )
$ docker run -it \
  -v $(pwd)/config:/etc/tilty \
  --net=host \
  myoung34/tilty:latest \
  -r --config-file /etc/tilty/config.ini


$ git clone
$ pip install -e .


$ docker run -it -v $(pwd):/src -w /src --entrypoint /bin/sh python:3.7-alpine
$ apk add -U openssl-dev alpine-sdk libffi-dev python3-dev py3-bluez bluez-dev
$ pip3 install poetry
$ poetry install
$ poetry run tox

Functional Development

To test locally (and without using my tilty): I use iBeacon on android and set:

  • UUID to one of the ones listed in here
  • Major to a temperature in F
  • Minor to an SG*1000

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for Tilty, version 0.11.0
Filename, size File type Python version Upload date Hashes
Filename, size Tilty-0.11.0.tar.gz (11.3 kB) File type Source Python version None Upload date Hashes View
Filename, size Tilty-0.11.0-py3-none-any.whl (16.9 kB) File type Wheel Python version py3 Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page