├── README.md ├── balena-sense-dashboard.png ├── docker-compose.yml ├── grafana ├── Dockerfile.template ├── grafana.db ├── grafana.ini └── start.sh ├── influxdb └── Dockerfile.template └── sensor ├── Dockerfile.template ├── balena.png └── measure.py /README.md: -------------------------------------------------------------------------------- 1 | # Balena Sense 2 | Example of using the Pi, Sense-HAT, InfluxDB and Grafana. 3 | 4 | This is an example of a multicontainer application running InfluxDB, Grafana and a third container with Python3 and the Sense-HAT library. 5 | 6 | Push the application to balena and use the public device URL to access Grafana. The default login is admin/admin. 7 | 8 | Readings are taken from the humidity, temperature and barometric pressure sensors once every 10 seconds. 9 | 10 | ![](https://raw.githubusercontent.com/resin-io-playground/balena-sense/master/balena-sense-dashboard.png) 11 | -------------------------------------------------------------------------------- /balena-sense-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/balena-io-experimental/balena-sensehat-example/5ac729e868dbbea11401b58fb4cde453cd30bef7/balena-sense-dashboard.png -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | volumes: 3 | resin-data: 4 | services: 5 | influxdb: 6 | restart: always 7 | build: ./influxdb 8 | volumes: 9 | - 'resin-data:/data' 10 | grafana: 11 | restart: always 12 | build: ./grafana 13 | ports: 14 | - "80:3000" 15 | volumes: 16 | - 'resin-data:/data' 17 | sensor: 18 | privileged: true 19 | build: ./sensor 20 | restart: always 21 | depends_on: 22 | - influxdb 23 | - grafana 24 | -------------------------------------------------------------------------------- /grafana/Dockerfile.template: -------------------------------------------------------------------------------- 1 | FROM balenalib/%%BALENA_MACHINE_NAME%% 2 | 3 | COPY ./grafana.ini /usr/share/grafana/conf/custom.ini 4 | COPY ./grafana.db /tmp 5 | 6 | COPY ./start.sh /usr/src/app/start.sh 7 | 8 | RUN install_packages \ 9 | fontconfig-config \ 10 | fonts-dejavu-core \ 11 | libfontconfig1 \ 12 | ucf 13 | 14 | RUN curl -o /tmp/grafana.deb https://dl.grafana.com/oss/release/grafana_6.1.4_armhf.deb; 15 | 16 | RUN dpkg -i /tmp/grafana.deb && rm /tmp/grafana.deb 17 | 18 | CMD ["/bin/sh","/usr/src/app/start.sh"] 19 | -------------------------------------------------------------------------------- /grafana/grafana.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/balena-io-experimental/balena-sensehat-example/5ac729e868dbbea11401b58fb4cde453cd30bef7/grafana/grafana.db -------------------------------------------------------------------------------- /grafana/grafana.ini: -------------------------------------------------------------------------------- 1 | [paths] 2 | data = /data/grafana 3 | -------------------------------------------------------------------------------- /grafana/start.sh: -------------------------------------------------------------------------------- 1 | if [ ! -f /data/grafana/grafana.db ]; then 2 | mkdir /data/grafana 3 | cp /tmp/grafana.db /data/grafana/ 4 | fi 5 | 6 | exec /usr/sbin/grafana-server --homepath /usr/share/grafana 7 | -------------------------------------------------------------------------------- /influxdb/Dockerfile.template: -------------------------------------------------------------------------------- 1 | FROM balenalib/%%BALENA_MACHINE_NAME%%-alpine 2 | 3 | RUN apk add influxdb 4 | 5 | RUN sed -i 's|/var/lib/influxdb|/data/influxdb|g' /etc/influxdb/influxdb.conf 6 | 7 | CMD influxd 8 | -------------------------------------------------------------------------------- /sensor/Dockerfile.template: -------------------------------------------------------------------------------- 1 | FROM balenalib/%%BALENA_MACHINE_NAME%% 2 | 3 | ENV INITSYSTEM on 4 | 5 | RUN apt-get update && apt-get install -yq \ 6 | python3 \ 7 | python3-sense-hat \ 8 | python3-influxdb \ 9 | vim \ 10 | wget && \ 11 | apt-get clean && rm -rf /var/lib/apt/lists/* 12 | 13 | COPY . /usr/src/app 14 | WORKDIR /usr/src/app 15 | 16 | # Finally, start our app 17 | CMD ["python3", "/usr/src/app/measure.py"] 18 | -------------------------------------------------------------------------------- /sensor/balena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/balena-io-experimental/balena-sensehat-example/5ac729e868dbbea11401b58fb4cde453cd30bef7/sensor/balena.png -------------------------------------------------------------------------------- /sensor/measure.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | from sense_hat import SenseHat 4 | from influxdb import InfluxDBClient 5 | 6 | influx_client = InfluxDBClient('influxdb', 8086, database='balena-sense') 7 | influx_client.create_database('balena-sense') 8 | 9 | sense = SenseHat() 10 | 11 | sense.clear() 12 | sense.load_image("balena.png") 13 | time.sleep(2) 14 | sense.show_message("balena") 15 | 16 | count = 0 17 | 18 | while 1: 19 | measurements = [ 20 | { 21 | 'measurement': 'temperature', 22 | 'fields': { 23 | 'value': float(sense.temperature) 24 | } 25 | } 26 | ] 27 | 28 | measurements.extend([ 29 | { 30 | 'measurement': 'humidity', 31 | 'fields': { 32 | 'value': float(sense.humidity) 33 | } 34 | } 35 | ]) 36 | 37 | measurements.extend([ 38 | { 39 | 'measurement': 'pressure', 40 | 'fields': { 41 | 'value': float(sense.pressure) 42 | } 43 | } 44 | ]) 45 | 46 | sense.set_pixel(0, count, 0, 255, 0) 47 | count = count+1 48 | if count == 8: 49 | count = 0 50 | sense.set_pixel(0, count, 0, 0, 0) 51 | influx_client.write_points(measurements) 52 | time.sleep(10) 53 | --------------------------------------------------------------------------------