Last fall I got into playing with Ruuvitag sensors. Those are small, battery powered devices which measure temperature, humidity, pressure and acceleration. I placed one sensor to our sauna with and idea to make sauna call home: When certain temperature is reached, I’ll get a notification to my phone about sauna being ready to be utilized.
Ruuvitags are bluetooth beacons which broadcast measurements once in a second. Raspberry Pi has a bluetooth receiver built-in so it was a natural choice for listening the data stream. There is also a great Python library for Ruuvitags available which makes reading the measurements easy.
For notifications I’m utilizing Telegram messenger which I installed into my mobile. It’s an instant messaging app similar like WhatsApp or Signal. There’s a nice feature called bots which are basically third-party apps. The cool thing is that bots can be controlled using an API and that’s how I’m sending notifications to my phone. And there’s a Python library for Telegram also. What needs to be done in Telegram side is following:
- Create a bot
- Acquire token
- Acquire chatid
There are multiple how-to documents available how to do this and here’s one.
I made a Python script which listens the Ruuvitag data stream, parses temperature out of it and if certain temperature is reached, it will send a notification. Script utilizes a file to store timestamp of when the latest notification was sent. This timestamp combined with resend timelimit parameter is for not flooding the phone with notifications:
from ruuvitag_sensor.ruuvi import RuuviTagSensor from datetime import datetime import telegram import csv import sys # Two command line arguments: # 1. Temperature limit # 2. Resend timelimit in minutes macs = [''] # MAC address of a Ruuvitag timeout_in_sec = 10 temp_limit = float(sys.argv) # Temperature limit (Celsius) which indicates sauna being ready to enter temperature = 0 resend_timelimit = float(sys.argv) # Resend timelimit in minutes now = datetime.utcnow() dt_string = now.strftime("%Y-%m-%dT%H:%M:%S.%fZ") # Let's fetch the latest measurement (timestamp and temperature): reader = csv.reader( open("sauna.csv"), delimiter=";") for row in reader: latest_notification = datetime.strptime(row, "%Y-%m-%d %H:%M:%S.%f") prev_temp = row # Fetching data from Ruuvitag: data = RuuviTagSensor.get_data_for_sensors(macs, timeout_in_sec) for j in data: temperature = data[j]['temperature'] print('Measured temperature: '+str(temperature)) print('Temperature limit: ' + str(temp_limit)) datediff_in_minutes = (now - latest_notification).total_seconds() / 60 # time difference in minutes between now and when latest notification was sent print('diff in minutes: '+str(datediff_in_minutes)) print('resend timelimit: ' + str(resend_timelimit)) # IF temperature is above limit AND time difference between now and when latest notification was sent is more than resend timelimit THEN let's send a notification: if temperature >= temp_limit and datediff_in_minutes > resend_timelimit: # Let's create a Telegram bot bot = telegram.Bot(token='') chatid= chat_text = 'Sauna valmis! Lämpötila: ' + str(temperature) bot.send_message(chat_id=chatid, text=chat_text) f = open("sauna.csv", 'w') with f: # Let's write latest measurement into a file: writer = csv.writer(f, delimiter=";") writer.writerow([now, temperature])
MAC address of Ruuvitag must be placed into line 11. Lines 39-40 are for Telegram token and chatid.
Script is scheduled using cron. Below’s a screenshot of an actual notification.