Last active
June 21, 2022 16:34
-
-
Save enlavin/e2f28275e575f5fd99ec85d70d0efc6e to your computer and use it in GitHub Desktop.
Telegram bot to monitor temperatures. Created to itch my scratch of wanting to monitor the temperature of a brewing vessel using ESP8266/DS18B20 and a mosquitto broker. Temperatures are logged using RRDTOOL and recorded every 10 seconds.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import __main__ | |
import os | |
import tempfile | |
import paho.mqtt.client as mqtt | |
import rrdtool | |
import telegram | |
import telegram.ext | |
TOKEN_ID = '<your bot id>' | |
MQTT_SERVER = '<your mqtt server>' | |
# temperature read from the sensor and shared between the telegram thread and | |
# the main thread. This is a read only variable and I don't really need | |
# precision here, so I'm not even worrying about protecting any concurrent | |
# access. That's how I roll. | |
temp = 85 | |
# -- telegram section | |
updater = telegram.ext.Updater(token=TOKEN_ID) | |
dispatcher = updater.dispatcher | |
def on_beertemp(bot, update): | |
# global variables! | |
global temp | |
bot.send_message(chat_id=update.message.chat_id, text=temp) | |
def beer_rrd(): | |
return os.path.join(os.path.dirname(__main__.__file__), 'beer.rrd') | |
def on_beertempchart(bot, update): | |
# call rrdtool to generate a chart | |
fd, fname = tempfile.mkstemp('.png') | |
rrdtool.graph( | |
fname, | |
'-w', '800', | |
'-h', '300', | |
'-a', 'PNG', | |
'--start', '-{0}'.format(6*5*60*24), | |
'--end', 'now', | |
'DEF:temp1={0}:temp1:MAX'.format(beer_rrd()), | |
'LINE1:temp1#ff0000:"cerveza"' | |
) | |
try: | |
with open(fname) as f: | |
bot.send_photo(chat_id=update.message.chat_id, photo=f) | |
finally: | |
os.unlink(fname) | |
# register /beer and /chart command handlers | |
beertemp_handler = telegram.ext.CommandHandler('beer', on_beertemp) | |
dispatcher.add_handler(beertemp_handler) | |
beertempchart_handler = telegram.ext.CommandHandler('chart', on_beertempchart) | |
dispatcher.add_handler(beertempchart_handler) | |
updater.start_polling() | |
# -- paho MQTT section | |
# The callback for when the client receives a CONNACK response from the server. | |
def on_connect(client, userdata, flags, rc): | |
print("Connected with result code "+str(rc)) | |
# Subscribing in on_connect() means that if we lose the connection and | |
# reconnect then subscriptions will be renewed. | |
client.subscribe("/topic/temp1") | |
# The callback for when a PUBLISH message is received from the server. | |
def on_message(client, userdata, msg): | |
global temp | |
temp = float(msg.payload) | |
# call rrd tool to update chart | |
rrdtool.update(beer_rrd(), 'N:{0}'.format(temp)) | |
client = mqtt.Client() | |
client.on_connect = on_connect | |
client.on_message = on_message | |
client.connect(MQTT_SERVER, 1883, 60) | |
# Blocking call that processes network traffic, dispatches callbacks and | |
# handles reconnecting. | |
# Other loop*() functions are available that give a threaded interface and a | |
# manual interface. | |
client.loop_forever() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment