Telegram бот для ведения учета показаний счетчиков и расчета коммунальных платежей с визуализацией данных и настраиваемыми тарифами.
- Особенности
- Технические характеристики
- Установка и настройка
- Структура проекта
- Использование
- API и команды
- База данных
- Графики и аналитика
- Безопасность
- Логирование
- 📊 Добавление показаний - Ввод показаний счетчиков с валидацией
- 📈 История показаний - Просмотр всех записей с пагинацией
- 📊 Графики расходов - Линейные графики с точками для визуализации
- ⚙️ Настройка тарифов - Индивидуальные тарифы для каждого пользователя
- 🔒 Админ-контроль - Доступ только для администратора
- Проверка на корректность введенных данных
- Валидация: новые показания не могут быть меньше предыдущих
- Автоматический расчет потребления и стоимости
- Перезапись показаний за тот же месяц
- Сравнение с предыдущим месяцем (стрелки вверх/вниз)
- Показ разности потребления в скобках
- Линейные графики с точками для трендов
- Показ только последних 12 записей на графике
aiogram==2.20.0 # Telegram Bot API
matplotlib==3.7.2 # Генерация графиков
Pillow==10.0.0 # Обработка изображений
- SQLite - легковесная встроенная БД
- Таблицы:
users- пользователи ботаuser_settings- настройки тарифовmeter_readings- показания счетчиков
- FSM (Finite State Machine) - для управления состояниями ввода
- Модульная структура - разделение по функциональности
- Обработчики событий - асинхронные обработчики команд
- Inline клавиатуры - интерактивные кнопки
git clone <repository-url>
cd meterTrackpip install -r requirements.txtОтредактируйте config.py:
TOKEN = 'YOUR_BOT_TOKEN' # Токен бота от @BotFather
ADMIN_ID = 123456789 # ID администратора
BD = 'meter_track.db' # Имя базы данных
# Тарифы по умолчанию
DEFAULT_LIGHT_RATE = 4.5 # руб/кВт⋅ч
DEFAULT_GAS_RATE = 6.0 # руб/м³
DEFAULT_WATER_RATE = 35.0 # руб/м³
DEFAULT_DRAIN_RATE = 25.0 # руб/м³python app.pymeterTrack/
├── app.py # Точка входа приложения
├── config.py # Конфигурация бота
├── requirements.txt # Зависимости Python
├── README.md # Документация
│
├── handlers/ # Обработчики команд
│ ├── __init__.py
│ ├── main.py # Основные команды (/start, /help, /add, /history, /chart)
│ ├── menu_handlers.py # Обработчики кнопок главного меню
│ ├── meter_readings.py # FSM для ввода показаний
│ ├── settings.py # Настройка тарифов
│ ├── callback.py # Обработчики inline кнопок
│ └── navigation.py # Навигация по логам
│
├── keyboards/ # Клавиатуры
│ ├── default/ # Обычные клавиатуры
│ │ ├── main_menu.py # Главное меню
│ │ └── keyboards.py # Дополнительные клавиатуры
│ └── inline/ # Inline клавиатуры
│ ├── readings.py # Клавиатуры для показаний
│ └── nav_log.py # Навигация по логам
│
├── states/ # FSM состояния
│ ├── __init__.py
│ └── client.py # Состояния для ввода данных
│
├── utils/ # Утилиты
│ ├── database.py # Работа с базой данных
│ ├── text.py # Тексты и константы
│ ├── chart_generator.py # Генерация графиков
│ ├── analytics.py # Аналитика
│ └── function.py # Вспомогательные функции
│
├── log/ # Логи
│ ├── bot.log # Лог работы бота
│ └── metrics.json # Метрики
│
└── cache/ # Кэш
- Отправьте
/startботу - Настройте тарифы в разделе "⚙️ Настройки"
- Добавьте первые показания через "📊 Добавить показания"
- Нажмите "📊 Добавить показания" или отправьте
/add - Введите показания электросчетчика (кВт⋅ч)
- Введите показания газового счетчика (м³)
- Введите показания водосчетчика/слива (м³) - оба значения будут равны
- Бот автоматически рассчитает потребление и стоимость
- Команда:
/historyили кнопка "📈 История" - Пагинация: Навигация по страницам (по 5 записей)
- Информация: Показ разности с предыдущим месяцем
- Сортировка: От новых к старым
- Команда:
/chartили кнопка "📈 График" - Тип: Линейный график с точками
- Данные: Последние 12 записей
- Цвет: Синий (#1f77b4)
- Команда:
/settingsили кнопка "⚙️ Настройки" - Тарифы: Электроэнергия, газ, вода, слив
- Сохранение: Автоматическое сохранение изменений
| Команда | Описание | Доступ |
|---|---|---|
/start |
Запуск бота и регистрация | Админ |
/help |
Справка по использованию | Админ |
/add |
Добавить показания | Админ |
/history |
История показаний | Админ |
/chart |
График расходов | Админ |
/settings |
Настройки тарифов | Админ |
/cancel |
Отмена текущей операции | Админ |
# Добавление показаний
MeterReadingStates.waiting_for_light # Ожидание показаний света
MeterReadingStates.waiting_for_gas # Ожидание показаний газа
MeterReadingStates.waiting_for_water # Ожидание показаний воды/слива
# Настройки тарифов
SettingsStates.waiting_for_light_rate # Ожидание тарифа за свет
SettingsStates.waiting_for_gas_rate # Ожидание тарифа за газ
SettingsStates.waiting_for_water_rate # Ожидание тарифа за воду
SettingsStates.waiting_for_drain_rate # Ожидание тарифа за сливCREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tg_id INTEGER UNIQUE NOT NULL,
username TEXT,
first_name TEXT,
last_name TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)CREATE TABLE user_settings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
light_rate REAL DEFAULT 4.5,
gas_rate REAL DEFAULT 6.0,
water_rate REAL DEFAULT 35.0,
drain_rate REAL DEFAULT 25.0,
FOREIGN KEY (user_id) REFERENCES users (id)
)CREATE TABLE meter_readings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
reading_date TEXT NOT NULL,
light_reading REAL NOT NULL,
gas_reading REAL NOT NULL,
water_reading REAL NOT NULL,
drain_reading REAL NOT NULL,
light_consumption REAL DEFAULT 0,
gas_consumption REAL DEFAULT 0,
water_consumption REAL DEFAULT 0,
drain_consumption REAL DEFAULT 0,
total_cost REAL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (id)
)- Добавление показаний:
add_meter_reading()- с валидацией и перезаписью - Получение истории:
get_readings_with_differences()- с расчетом разностей - Настройки:
update_user_settings()- обновление тарифов - Последние показания:
get_last_reading()- для отображения
- Линейные графики с точками
- Цвет: Синий (#1f77b4)
- Точки: Круглые маркеры с белой обводкой
- Подписи: Значения в белых блоках над точками
- Потребление: Автоматический расчет разности с предыдущим месяцем
- Стоимость: Расчет на основе настроенных тарифов
- Тренды: Стрелки вверх/вниз для сравнения с предыдущим месяцем
- Период: Показ последних 12 записей
plt.rcParams['font.family'] = ['DejaVu Sans', 'Arial', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False
# Отключение предупреждений о шрифтах
warnings.filterwarnings('ignore', category=UserWarning, module='matplotlib.font_manager')- Админ-проверка: Только администратор может использовать бота
- ID администратора: Настраивается в
config.py - Валидация данных: Проверка корректности введенных значений
- Локальная БД: SQLite файл хранится локально
- Валидация: Предотвращение некорректных данных
- Обработка ошибок: Graceful handling исключений
- INFO: Обычная работа бота
- ERROR: Ошибки и исключения
- DEBUG: Детальная отладочная информация
log/bot.log- основной лог работы ботаlog/metrics.json- метрики и статистика
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('log/bot.log', encoding='utf-8'),
logging.StreamHandler()
]
)FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]# Установка зависимостей
pip install -r requirements.txt
# Настройка конфигурации
# Отредактируйте config.py
# Запуск бота
python app.py- Heroku: Простое развертывание с Procfile
- Railway: Автоматическое развертывание
- VPS: Полный контроль над сервером
- Форкните репозиторий
- Создайте ветку для новой функции
- Внесите изменения
- Создайте Pull Request
- Используйте Issues для багов
- Опишите шаги воспроизведения
- Приложите логи ошибок
Этот проект распространяется под лицензией MIT. См. файл LICENSE для подробностей.
Meter Track - Удобный учет коммунальных платежей в Telegram! 🏠📊