Skip to content

Instantly share code, notes, and snippets.

@Mictronics
Last active April 28, 2024 15:58
Show Gist options
  • Save Mictronics/08f6925ba33cb3e3914ea6b92e5018df to your computer and use it in GitHub Desktop.
Save Mictronics/08f6925ba33cb3e3914ea6b92e5018df to your computer and use it in GitHub Desktop.
Python script sends status report to Telegram bot
#!/usr/bin/env python3
from pisugar import *
import asyncio
import os
import sys
import logging
from telegram import Update
from telegram.ext import filters, MessageHandler, ApplicationBuilder, CommandHandler, ContextTypes
import gammu.smsd
# Setup logging
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.ERROR
)
# Get Gammu SMSD service
smsd = gammu.smsd.SMSD("/etc/gammu-smsdrc")
# Connect to Pisugar
conn, event_conn = connect_tcp('localhost')
ps = PiSugarServer(conn, event_conn)
is_charging = None
is_plugged = None
# Gives a human-readable uptime string
def uptime():
try:
f = open( "/proc/uptime" )
contents = f.read().split()
f.close()
except:
return "Cannot open uptime file: /proc/uptime"
total_seconds = float(contents[0])
# Helper vars:
MINUTE = 60
HOUR = MINUTE * 60
DAY = HOUR * 24
# Get the days, hours, etc:
days = int( total_seconds / DAY )
hours = int( ( total_seconds % DAY ) / HOUR )
minutes = int( ( total_seconds % HOUR ) / MINUTE )
seconds = int( total_seconds % MINUTE )
# Build up the pretty string (like this: "N days, N hours, N minutes, N seconds")
string = ""
if days > 0:
string += str(days) + " " + (days == 1 and "day" or "days" ) + ", "
if len(string) > 0 or hours > 0:
string += str(hours) + " " + (hours == 1 and "hour" or "hours" ) + ", "
if len(string) > 0 or minutes > 0:
string += str(minutes) + " " + (minutes == 1 and "minute" or "minutes" ) + ", "
string += str(seconds) + " " + (seconds == 1 and "second" or "seconds" )
return string;
# Start command handler
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await context.bot.send_message(chat_id=update.effective_chat.id, text="\U0001f916 SIM Gateway bot ready.")
# Status command handler
async def status(update: Update, context: ContextTypes.DEFAULT_TYPE):
global smsd
net = smsd.GetStatus()['NetworkSignal']
level= int(ps.get_battery_level())
voltage = round(ps.get_battery_voltage(),2)
#current = ps.get_battery_current()
temp = int(ps.get_temperature())
plugged = ps.get_battery_power_plugged()
charging = ps.get_battery_charging()
text_status = f"Battery: {level}%\nVoltage: {voltage}V\nTemperature: {temp}°C\nNetwork: {net}\nPlugged: {plugged}\nCharging: {charging}\nUptime: {uptime()}"
await context.bot.send_message(chat_id=update.effective_chat.id, text=text_status)
# PiSugar monitoring callback
async def pisugar_monitoring(context: ContextTypes.DEFAULT_TYPE):
global is_plugged, is_charging
plugged = ps.get_battery_power_plugged()
charging = ps.get_battery_charging()
if is_plugged != plugged:
is_plugged = plugged
await context.bot.send_message(chat_id=[your chat id], text=f"\U0001f50c Plugged now: {plugged}")
if is_charging != charging:
is_charging = charging
await context.bot.send_message(chat_id=[your chat id], text=f"\U0001f50b Charging now: {charging}")
if __name__ == '__main__':
application = ApplicationBuilder().token('[your bot token]').build()
job_queue = application.job_queue
start_handler = CommandHandler('start', start)
status_handler = CommandHandler('status', status)
application.add_handler(start_handler)
application.add_handler(status_handler)
job_monitoring = job_queue.run_repeating(pisugar_monitoring, interval=30, first=60)
application.run_polling()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment