Simple smart-home automation system. Self-hosted, LAN only. Supports Vakio Lytko and Yeelink.
Project description
Установка
Тестировалось только на Ubuntu 22.04
Последняя версия
git clone https://codeberg.org/strizhechenko/mqtt_automator.git /opt/mqtt/
apt install python3.11
python3.11 -m pip install /opt/mqtt/
cd /opt/mqtt/examples/config_example.yml /opt/mqtt/config.yml # правим его под себя
cp -va /opt/mqtt/automator.service /etc/systemd/system/mqtt-automator.service
systemctl enable --now mqtt-automator
Обновление из pypi
Установить с нуля таким образом не выйдет. Всё равно требуется установка systemd-юнита и написание config.yml, который должен лежать в /opt/mqtt/
.
pip3 install mqtt-automator
Разработка
Если планируется делать доработки и делиться ими: лучше использовать pyenv с python3.11, я тестировал только на нём. Внутри virtualenv выполните:
pip install '/opt/mqtt/[test]'
pre-commit install-hooks
Запуск тестов:
pytest # параметры он прочитает из pyproject.toml
Запуск линтера:
pylint # параметры он прочитает из pyproject.toml
Поддерживаемые устройства
- термостат Lytko 101
- рекуператоры Vakio Base Smart
- светильники Yeelink
Почему не Home Assistant?
- Хотелось поразвлекаться с asyncio и сделать чудо-монолит
- Хотелось понимать, как управляются устройства под капотом
- У меня своеобразные хотелки в вопросе приоритета управления устройствами через физические кнопки
- Хотелось иметь максимально простой формат конфиг-файла, причём один на все устройства
- Оно потребляет всего 20мб оперативной памяти, разве не стоило велосипедов?
Архитектура
В одном потоке уживаются несколько вечных асинхронных тасок. Это как треды/потоки, только задачи в терминологии asyncio. За счёт того что я не строю хайлоад - они прекрасно уживаются и имеют общее состояние. Скорее всего есть баги конкурентности, но ничего страшного от них не случится.
Таски:
- schedule - расписание, эдакий cron для управления устройством, но с учётом его текущего состояния - лишние события, которые ничего не изменят, посылаться не будут.
- feedback - построение изначального состояния устройств за счёт получения его от брокера при подписке на топики + обработка действий с устройством мимо этой системы - через пульты и кнопки, ручками. Ручные действия имеют приоритет над расписанием в течение 4 часов.
В целом проект придерживается минимализма. Небольшой файл в 40 строк - лучше, чем дополнительная зависимость на 1мб.
Персистентного состояния нет, если демон был перезапущен - он потеряет информацию о ручных действиях. Можно было бы держать эти словари (devices.base.BaseClient.block
) в sqlite, postgresql или redis, но это кажется излишним усложнением.
План развития
- Оформить код как библиотеку, перенести
automator.py
внутрь неё. Это позволит стороннему пользователю установить её из pypi, импортироватьfrom $libname.automator import Automator
,from $libname.devices.base import BaseClient
, реализовать клиент к своему устройству и добавить его вAutomator.client_map
между инициализацией и запуском. - В будущем хочу добавить простенький веб-интерфейс на aiohttp + jinja2 (в качестве третьей вечной таски), через который можно будет управлять устройствами.
- Дописать тесты к движку правил.
Происхождение
Изначально форк https://github.com/roppert/mosquitto-python-example.git, но от него не осталось почти ничего.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for mqtt_automator-0.0.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a4eca22cce239a3c682bb0a59447c60ad1d434ac03c8ab85868c867ea4c7b193 |
|
MD5 | 523d09cca4d7efe3be372275b475fd69 |
|
BLAKE2b-256 | 0b5cf9fd367b5631590e12c1b9c9413b6d57a268b5f9042ea3c1f5fd7abe0135 |