Last active
April 28, 2024 15:58
-
-
Save Mictronics/08f6925ba33cb3e3914ea6b92e5018df to your computer and use it in GitHub Desktop.
Python script sends status report to Telegram bot
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
#!/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