Умный дом на python: Умный дом своими руками + Python / Хабр

Bubot — очень легкий фреймворк на Python 3 для программирования роботов и домашней автоматизации

Хотелось создать своего робота, а так же автоматизировать управление светом и климатом дома. С этой целью начал изучать имеющиеся возможности. Для себя я разделил все решения на две группы: системы в которых код на контроллере выполняется в одном главном цикле (arduino, lego и т.п.) и системы состоящие из параллельно работающих процессов обменивающихся между собой сообщениями.

Интуитивно выбрал вторую группу, так как хотелось найти максимально простое решение с дружественным пользовательским интерфейсом. Из наиболее популярных представителей этого «семейства» очень понравились Microsoft Robotics Studio и ROS. Но к сожалению, на текущий момент, привязать их к конкретному железу весьма не просто, да и разобраться в них с нуля так же весьма не тривиальная задача. В итоге принял решение писать сам, но «кодить» на C очень не хотелось, Душа просила чего-нибудь попроще и полегче. В итоге выбрал Python. А учитывая, что по мимо робота и «умного дома» в голову начало лезть куча других идей, то решил сразу сделать небольшой фреймворк, в котором основной упор был бы сделан на простоту разработки.

Концептуально фреймворк представляет собой набор поддерживаемых пользователем модулей реализующих различные функции робототехники. При работе Bubot строит сеть из процессов, которые могут асинхронно получать и отправлять сообщения между собой. Так же вы можете построить сеть из роботов, которые будут общаться между собой.

Сеть процессов строится на базе стандартного Python модуля multiprocessing. Система обмена сообщениями и разделяемая память реализованы при помощи Redis.

Каждый Bubot имеет встроенный веб-сервер веб-сервер Tornado, который позволяет контролировать состояние, управлять роботом, на ходу менять параметры (калибровать) робота, а также закладывается возможность обмена данными между роботами.

Bubot не является системой реального времени, хотя Bubot возможно интегрировать с кодом реального времени.

Изучать что-либо новое всегда проще на примере, и первое что приходит в голову, это переделать радиоуправляемую игрушку на управление с помощью веб-интерфейса через wi-fi или 3G.

Для этого нам понадобится любая китайская радиоуправляемая машинка и любой мини компьютер на котором может работать Python 3. В качестве подопытного кролика был приобретен один из самых доступных — raspberry pi b+.

Изначально практически любая радиоуправляемая машинка — это два мотора и примитивный радио модуль. Нам от неё надо только моторы и чтобы сама машинка была подходящего размера для размещения всей электроники.

Для начала упростим задачу — наша машинка должна выполнять четыре действия: ехать вперед или назад, поворачивать влево или вправо.

Для решения поставленной задачи нам необходимо:

  • Подключить моторы к raspberry
  • Реализовать сервис, который будет принимать и интерпретировать команды пользователя на конкретные физические устройства
  • Реализовать веб интерфейс, который будет передавать команды пользователя: Установить мощность основного или поворотного двигателя -100% / 0% / 100%.

Простейшим способом подключения моторов к Raspberry Pi будет использование готового контроллера, выбор которого зависит только от предполагаемой мощности моторов. Я выбрал с запасом на базе L298N. Строка для поиска на aliexpress «L298N motor driver board», обойдется Вам примерно в $3 с доставкой.

Также, для питания raspberry, Вам понадобится как минимум один понижающий преобразователь напряжения. Я взял на базе LM2596. Строка для поиска на aliexpress «DC-DC LM2596», обойдется Вам примерно в $1 с доставкой.

При таком подключении, для чтобы заставить машину выполнить одну из наших команд, достаточно выставить высокий уровень на соответствующем GPIO.

В целях упрощения модели, пусть у нас команды поступают непосредственно на моторы.

Поскольку у нас два одинаковых (с программной точки зрения) мотора, то нам потребуется один модуль. Все модули наследуются либо от базового класса Buject, либо от его потомков. От базового класса разработчик получает основной бесконечный цикл, методы для обработки и передачи событий. Модули в фреймворке находятся в каталоге buject. Каждый модуль состоит из двух файлов:

  • [название модуля].py — логика модуля
  • [название модуля].json — описание модуля. Содержит список параметров модуля, их значения по умолчанию, список возможных статусов, описание сообщений генерируемых модулем, и список сообщений на которые модуль подписан.

Пример модуля для наших моторов \buject\MotorTest.py:

import json
from buject.Buject import Buject
import RPi.GPIO as GPIO
class MotorTest(Buject): # сервомотор без обратной связи
def __init__(self, user_config=None):
super(MotorTest, self).__init__(user_config)
# Метод вызывается перед запуском основго цикла
# выставляем режим работы GPIO
def on_ready(self):
GPIO.setmode(self.param["mode"])
GPIO.setwarnings(False)
# фреймворк при получения сообщения, вызывает одноименный метод для его обработки
# передавая ему в качестве параметра все сообщение
# данный модуль у нас будет уметь принимать только один запрос
# set_power на установку мощности мотора в процентах
def incoming_request_set_power(self, message):
data = json. loads(message['data'])
if data['param']['value'] > 0: # хотим ехать вперед
GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0)
GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 1)
self.status['action'] = "forward"
elif data['param']['value'] == 0:
GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0)
GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0)
self.status['action'] = "stopped"
else:
GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0)
GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 1)
self.status['action'] = "backward {0}%".format(self.status["power"])
# в режиме отладки получаем сообщение, что все отработало
if self.param['debug'] > 1:
self.log('Buject "{0}" {1}'.format(self.param['name'], self.status['action']))

Комментарии, думаю излишни. Приходит запрос, в параметрах которого указана мощность мотора, если она больше нуля говорим мотору ехать вперед, меньше — назад, равна нулю — стоим.

Бесконечный цикл в данном случае задействован не был. В случае его наличия достаточно определить метод main_loop().

Пример описания модуля для наших моторов \buject\Motor.json

{
"param": {
"name": {
"value": "MotorTest",
"description": "название сервиса по умолчанию"
},
"parent": {
"value": "Buject",
"description": "название базового модуля, с которого наследуются другие параметры"
},
"buject": {
"value": "MotorTest",
"description": "название модуля = имени файла"
},
"GPIO_forward": {
"value": 0,
"description": "канал GPIO для движения вперед"
},
"GPIO_backward": {
"value": 0,
"description": "канал GPIO для движения назад"
},
"GPIO_mode": {
"value": 11,
"description": "value for GPIO.setmode GPIO.BOARD=10 GPIO.BCM=11"
}
},
"incoming_request": {
"set_power": {
"name": "set_power",
"description": "установка мощности мотора",
"param": {
"value": {
"description": "мощность мотора в процентах",
"type": "int"
} } } } }

Раздел param содержит список параметров необходимых для запуска и работы модуля. Первые три обязательные для каждого модуля, и наследуются от базового класса Buject. Последние являются специфичными только для этого модуля, их количество и название Вы придумываете сами в зависимости от потребностей. GPIO_mode задает режим адресации GPIO и в дальнейшем переопределяться не будет. В то время как для GPIO_forward и GPIO_backward нет смысла задавать значения по умолчанию, т.к. они зависят исключительно от того к каким выводам будет подключен конкретный мотор и мы их определим дальше в параметрах запуска этого модуля.

Также описание модуля может содержать секцию status — где описаны все рассчитываемые параметры — отражающие текущее состояние модуля. В нашем модуле нет никаких добавленных статусов, однако, если Вы обратили внимание, в коде самого модуля мы изменяем статус ‘action’, который определен в описании базового модуля Buject.

Фреймворк предоставляет возможность использовать пять типов сообщений

  • incoming_request — список запросов, которые может обрабатывать модуль.
  • outgoing_request — список запросов генерируемых модулем. В качестве параметров обязательно указать имя сервиса принимающего запросы и имя запроса.
  • incoming_event — список подписки на события других модулей, обязательно указать имя сервиса и имя события.
  • outgoing_event — список событий, на которые могут подписаться другие модули.
  • incoming_response — служебный тип, который декларируется на исходящем запросе. Говорит о том, что сервис будет ожидать асинхронного ответа на запрос.

Каждый робот может иметь неограниченное количество веб интерфейсов. В нашем случае, для управления роботом, нам достаточно одного – реализующего 4 кнопки, которые при нажатии будет давать команду, а при отжатии её отменять.

Пользовательские интерфейсы хранятся в каталоге ui. Каждая страница пользовательского интерфейса описывается в отдельном подкаталоге, и состоит как минимум из 2 файлов:

  • [Имя страницы].html — разметка страницы.
  • [Имя страницы].json — описание интерфейса. Каждая страница (сессия) для фреймворка является по сути отдельным сервисом, в данном файле содержится описание событий на которые данная страница подписана, а также сообщения которые она генерирует.
  • [Имя страницы].py — (не обязателен) может содержать серверную логику по обработке команд данного пользовательского интерфейса, в нашем случае не пригодится.

Давайте опять, для улучшения восприятия, ещё немного упростим. В приведенном ниже примере рассмотрим алгоритм одной кнопки вперед. Остальные можно сделать по аналогии.

Итак, создаем в каталоге ui подкаталог scout_easy и в нем два файла scout_easy.html и scout_easy.json следующего содержания (комментарии по тексту).

\ui\scout_easy\scout_easy.html

Обратите внимание на div id=console, если он присутствует, то в него фреймворк будет выводить все консольные сообщения, в т.ч. происходящие на стороне сервера ошибки кода.

bubot_socket.js — должен присутствовать на каждой странице ui, так как именно он отвечает за установку соединения с сервером и обмен сообщениями.

Соединение с сервером происходит через web socket, метод bubot_send_message([название сообщения], [параметры сообщения]) отвечает за передачу сообщений на сервер. На сервере при поступлении сообщения вызывается одноименный метод, которому передаются параметры сообщения. В нашем случае вызывается метод отправляющий запрос set_move_motor_power, имя сервиса получателя сообщения фреймворк берет из файла описания пользовательского интерфейса, названия этих сервисов определяется в заключительном разделе при описании робота.

\ui\scout_easy\scout_easy.json

{
"incoming_request": {
"console": {
"time": {},
"message": {}
}
},
"outgoing_request": {
"set_move_motor_power": {
"name": "set_power",
"buject": "move_motor",
"description": "команда на установку мощности основного мотора",
"param": {
"value": {
"description": "мощность мотора в процентах, вперед > 0, назад  0, влево 

Итак, мы подготовили все части робота. Чтобы его запустить, нужен ещё один файл с описанием самого робота.

В каталоге config хранятся описания всех Ваших роботов. Создавать описание можно как вручную, так и про помощи конфигуратора — но об этом подробнее на видео о bubot: scout.

Итак, для нашего первого робота описание будет выглядеть следующим образом:

\config\scout_easy.json

{
"param": {
"name": {
"value": "scout_easy"
}
},
"depend_buject": { # раздел содержит список сервисов из которых состоит робот
"move_motor": { # название сервиса, ниже присваиваем значения только тем параметрам, которые отличаются от значений по умолчанию в соответствующем модуле
"param": {
"buject": { # название модуля из которого будет запущен сервис
"value": "MotorTest"
},
"name": { # название сервиса
"value": "move_motor"
},
"GPIO_forward": { # назначаем каналы к которым фактически подключен мотор
"value": 20
},
"GPIO_reward": {
"value": 21
}
}
},
"rotate_motor": { # аналогично для рулевого мотора
"param": {
"buject": {
"value": "MotorTest"
},
"name": {
"value": "rotate_motor"
},
"GPIO_forward": {
"value": 13
},
"GPIO_reward": {
"value": 19
} } } } }

Согласно данному описанию, Bubot при старте создаст два экземпляра модуля MotorTest с разными параметрами: один для основного мотора — move_motor, другой для рулевого мотора -rotate_motor и запустит из в качестве процессов. Как вы видите, способ адресации GPIO мы не указали, т.к. нас устраивает значение по умолчанию, а вот параметры GPIO_forward и GPIO_backward мы переопределили в соответствии со схемой подключения моторов.

Теперь у нас совсем все готово. Можно запускать.

python3 StartBubot scout_easy

Открываем в браузере подготовленный нами пользовательский интерфейс http://localhost/ui/scout_easy и пробуем нажать на кнопку. При первом запуске Вас попросят ввести логин и пароль — введите любые значения, по умолчанию права доступа к системе не установлены.

Если поступательно развивать нашу машинку дальше, то следующий шаг это регулировка оборотов привода, замена рулевого мотора на серву, установка камеры, приводов на камеру, синтезатора речи, распознавание голосовых команд и т.д. Но это уже совсем другая история.

Home Assistant. Обновление Python — Умный дом

Если вы пользуетесь Home Assistant, то после очередного обновления могли заметить на появившееся уведомление о том, что «Support for the running Python version 3. 7.3 is deprecated and will be removed in the first release after December 7, 2020. Please upgrade Python to 3.8.0 or higher».

В стандартных системных репозиториях обычно содержатся стабильные и надежные версии пакетов, а не самые свежие и актуальные. И по состоянию на середину января 2021 года Python в репозиториях Debian и Ubuntu так и не спешат обновлять до версии 3.8.x.

Поэтому единственный вариант убрать назойливое уведомление и избавить себя от возможных проблем с совместимостью грядущих обновлений Home Assistant — это установить новую версию Python вручную, предварительно собрав ее из исходников.

Исходные данные

В этой статье я буду исходить из того, что:

  • У вас уже установлен Home Assistant
  • Он установлен в виртуальное окружение Python
  • Используется операционнная система на базе Debian или Ubuntu

Если вы пользуетесь Docker-контейнерами или дистрибутивом Hass.io, то обновлять пакеты вручную вам не придется.

Обновление Python

На заметку


Процесс обновления описан на примере актуальной на момент написания статьи версии Python 3.9.1. На странице загрузок Python всегда можно посмотреть номер свежего релиза и заменить ссылки на скачивание и распаковку архива в приведенных ниже командах.

Для начала остановим Home Assistant:

sudo systemctl stop [email protected]

Установим нужные для сборки из исходников пакеты:

sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libxslt-dev libxml2-dev libjpeg-dev zlib1g-dev

Скачаем и распакуем архив с Python 3.9.1:

wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz
tar xzvf Python-3.9.1.tgz
cd Python-3.9.1

Соберем его из исходников и запустим установку:

./configure --enable-optimizations
make -j 4
sudo make install

Процесс сборки занимает около 12 минут на Raspberry Pi 4, поэтому придется запастись терпением.

 

 

 

После завершения установки можно проверить, что Python действительно обновился путем выполнения двух команд:

python3 --version
pip3 --version

И если в консоли появится такие ответы, то процесс обновления прошел успешно:

Теперь обновим менеджер пакетов pip:

sudo /srv/homeassistant/bin/python3.9 -m pip install --upgrade pip
sudo python3.9 -m pip install --upgrade pip

В случае если после обновления Python при запуске Home Assistant появится ошибка с доступностью библиотеки libffi.so.7 можно создать симлинк с libffi.so.7 на нее:

sudo ln -s /usr/lib/arm-linux-gnueabihf/libffi.so.6 /usr/lib/arm-linux-gnueabihf/libffi.so.7

Если симлинк не создается, то значит в вашей системе libffi.so.6 находится по другому пути. Найдите корректный путь через поиск по названиям файлов:

find /usr/lib -name "libffi.so*"

Переустановка Home Assistant

Теперь переустановим Home Assistant. Для этого сохраним в файл список используемых им пакетов Python:

cd /home/homeassistant/
sudo  -u homeassistant -H -s
source /srv/homeassistant/bin/activate
pip3 freeze –local > requirements.txt
deactivate
exit

Удалим директорию с установленным Home Assistant и создадим ее заново:

sudo rm -r /srv/homeassistant
sudo mkdir /srv/homeassistant
sudo chown homeassistant:homeassistant /srv/homeassistant

Запустим процесс установки по сохраненному ранее списку пакетов:

sudo -u homeassistant -H -s
cd /srv/homeassistant
python3.9 -m venv .
source /srv/homeassistant/bin/activate
pip3 install wheel
pip3 install -r /home/homeassistant/requirements.txt

И, наконец, перезапустим сервис Home Assistant:

sudo systemctl restart home-assistant@homeassistant

На этом процесс обновления завершен окончательно, и после перезапуска из панели уведомлений должно исчезнуть сообщение о неподдерживаемой версии Python.

 

(c) Dmitry’s notes https://dmitrysnotes.ru/home-assistant-obnovlenie-python

smarthomeconnect · PyPI

Smart Home Connect (SHC) — это еще одна среда домашней автоматизации Python, наряду с Home Assistant, SmartHome.py, SmartHomeNG и, возможно, многими другими.
Его назначение — подключение устройств «умного дома» по различным протоколам связи, предоставление средств для создания правил/скриптов автоматизации и веб-интерфейса для управления устройствами через браузер.

В отличие от большинства других сред домашней автоматизации, SHC полностью основан на асинхронных сопрограммах Python (asyncio) и настраивается с помощью чистых сценариев Python, а не файлов YAML или причудливых инструментов веб-инженерии.
Его конфигурация основана на создании экземпляра Подключаемые объекты (такие как переменные состояния, кнопки пользовательского интерфейса, групповые адреса KNX и т. д.) и связывание их с помощью простых шаблонов чтения/подписки.
Таким образом, это довольно простое, но действительно мощное средство, обеспечивающее преобразование типов на лету, выражения для вычисления производных значений, обработку событий без сохранения состояния и т. д.
Подробнее о базовых концепциях SHC читайте в документации.

Характеристики

  • Интерфейсы
    • Шина KNX через KNXD
    • DMX (через Enttec DMX USB Pro и совместимые интерфейсы)
    • HTTP/REST API + API веб-сокета
    • Клиент SHC (подключение к другому экземпляру SHC через API веб-сокета)
    • MIDI (особенно для аппаратных MIDI-контроллеров)
    • МКТТ
    • Tasmota (в настоящее время: реле, подсветка RGB+CCW, ИК-приемник, датчики мощности; дополнительные функции будут добавлены по запросу)
    • Пульсаудио
    • Telegram-бот
  • Веб-интерфейс пользователя на основе веб-сокетов

  • (с использованием aiohttp , Jinja2 и Semantic UI )
    • виджеты: кнопки, отображение текста, ввод текста/чисел, раскрывающиеся списки, изображения с размещаемыми кнопками, диаграммы и т. д., …
  • конфигурация точек данных/переменных и правил автоматизации в простом Python
    • полная мощь Python + интуитивно понятное представление и взаимосвязь различных интерфейсов
    • система проверки типов и расширяемая система преобразования типов
    • подключение объектов через выражения Python
  • хронологических и периодических таймеров для запуска правил
  • Logging/Persistence (пока не очень стабильный в API)
    • в MySQL

Дорожная карта

  • API стабилизации ведения журнала
  • Вход в Influx-DB
  • Дополнительные веб-виджеты
    • Датчики
    • временная шкала / «полосатые» графики

Начало работы

  1. (необязательно) Создайте виртуальную среду, чтобы ваши репозитории пакетов Python оставались чистыми:

     python3 -m virtualenv -p python3 venv
    . venv/bin/активировать
     

    Узнайте больше о виртуальных средах в официальной документации Python.

  2. Установите дистрибутив smarthomeconnect Python из PyPI:

     pip3 установить smarthomeconnect
     

    Это будет только установка smarthomeconnect и зависимостей его основных функций.
    Для определенных интерфейсных модулей требуются дополнительные зависимости, которые можно установить с помощью функции «дополнительно» в pip/setuptool.
    Полный список см. в разделе «Зависимости» этого файла ознакомительных сведений.
    Если вы устанавливаете SHC из исходного дистрибутива (в отличие от «бинарного» пакета, такого как пакет «wheel» из PyPI), вам потребуются установленные на вашем компьютере NodeJS и npm, которые используются для загрузки ресурсов веб-интерфейса. в процессе сборки пакета Python.

  3. Создайте скрипт Python (назовем его my_home_automation.py ), который импортирует и запускает Smart Home Connect:

     #!/usr/bin/env python3
    импорт шк
    # TODO добавить интерфейсы и переменные
    шк. основной()
     

    При запуске этого скрипта ( python3 my_home_automation.py ) SHC должен запуститься и работать в режиме ожидания, пока вы его не завершите (например, с помощью Ctrl+C).
    См. приведенный ниже код для примера с веб-интерфейсом и интерфейсом KNX.

  4. Ознакомьтесь с основными концепциями SHC и доступными интерфейсами в документации по SHC.
    Расширьте свой сценарий, чтобы создавать интерфейсы и переменные, соединять подключаемых объектов, определять логические обработчики и позволять им запускаться.

Простой пример использования

 импорт даты и времени
импорт шк
импортировать shc.web
импортировать shc.interfaces.knx
# Настроить интерфейсы
knx_connection = shc.interfaces.knx.KNXConnector()
web_interface = shc.web.WebServer("localhost", 8080, "index")
web_index_page = web_interface.page('индекс')
# Простая переменная включения/выключения, связанная с групповым адресом KNX (инициализируется для каждой телеграммы чтения группы),
# с виджетом-переключателем в пользовательском веб-интерфейсе
потолочные_света = shc. Variable(bool, "потолочные светильники")\
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(1, 2, 3), dpt="1", init=True))
web_index_page.add_item(shc.web.widgets.Switch("Потолочные светильники")
                        .connect(потолочные_света))
# Сохраняем временную метку последнего изменения потолочных светильников в переменной (через логический обработчик) и показываем
# это в веб-интерфейсе пользователя
потолочные_света_last_change = shc.Переменная(
    datetime.datetime, "последнее изменение потолочного освещения",
    initial_value = datetime.datetime.fromtimestamp (0))
@ceiling_lights.trigger
@shc.handler()
асинхронное определение update_lastchange (_new_value, _source):
    ожидание потолка_света_last_change.write(datetime.datetime.now())
web_index_page.add_item(
    shc.web.widgets.TextDisplay(datetime.datetime, "{:%c}", "Последняя смена потолочных светильников")
    .подключить (потолочные_света_последнее_изменение))
# закрыть жалюзи с помощью кнопки в пользовательском веб-интерфейсе (событие без сохранения состояния, поэтому переменная не требуется)
web_index_page. add_item(shc.web.widgets.ButtonGroup("Жалюзи", [
    shc.web.widgets.StatelessButton(shc.interfaces.knx.KNXUpDown.DOWN,
                                    shc.web.widgets.icon("стрелка вниз"))
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(3, 2, 1), dpt="1.008"))
]))
# использовать синтаксис выражения для включения вентилятора при температуре выше 25 градусов
температура = shc.Variable(float, "температура")\
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(0, 0, 1), dpt="9", инициализация=Истина))
fan = shc.Variable(bool, "fan")\
    .connect(knx_connection.group(shc.interfaces.knx.KNXGAD(0, 0, 2), dpt="1"))\
    .connect(температура.EX > 25.0)
# Запустить СХК
шк.основной()
 

Лицензия

Smart Home Connect публикуется в соответствии с условиями лицензии Apache 2.0.

Он связан с несколькими сторонними работами:

  • «Призма» — тонкие узоры от Toptal Designers (Creative Commons BY-SA 3.0)

См. ЛИЦЕНЗИЯ и файл NOTICE для получения дополнительной информации.

Зависимости

SHC зависит от следующих пакетов Python:

  • aiohttp и его зависимостей (лицензия Apache 2.0, лицензия MIT, лицензия Python Software Foundation, LGPL 2.1, лицензия 3-Clause BSD)
  • jinja2 и MarkupSafe (лицензия BSD-3-Clause)

Для некоторых интерфейсов SHC требуются дополнительные зависимости.
Их можно установить автоматически через pip, указав соответствующий флаг «дополнительно», например. pip install smarthomeconnect[mysql] для поддержки ведения журнала MySQL.

  • Ведение журнала через MySQL [mysql] :
    • aiomysql и PyMySQL (лицензия MIT)
  • Интерфейс KNX [knx] :
    • knxdclient (лицензия Apache 2.0)
  • Интерфейс DMX [dmx] :
    • pyserial-asyncio и pySerial (лицензия BSD-3)
  • MIDI-интерфейс [миди] :
    • мидо (лицензия MIT)
    • python-rtmidi (лицензия MIT), вкл. RTMidi (модифицированная лицензия MIT)
  • Интерфейс MQTT [mqtt] :
    • paho-mqtt (публичная лицензия Eclipse v1.0 или Лицензия на распространение Eclipse v1.0)
    • asyncio-mqtt (лицензия BSD-3-пункт)
  • Pulseaudio интерфейс [импульсный] :
    • pulsectl и pulsectl-asyncio (лицензия MIT)
  • Интерфейс Telegram Bot [телеграмма] :
    • aiogram (лицензия MIT) + ее зависимости (лицензия BSD-3-Clause + MPL 2.0)
  • файловое постоянное хранилище [file_persistence] :
    • aiofile и caio (лицензия Apache 2.0)

Кроме того, для интерфейса веб-интерфейса требуются следующие библиотеки Javascript от NPM.
Они не включены ни в этот репозиторий, ни в исходные дистрибутивы SHC.
Вместо этого они загружаются и упаковываются во время сборки пакета Python и объединяются в «бинарные» пакеты Python (включая пакеты «колесо») SHC:

  • Fomantic UI CSS framework (лицензия MIT)
  • jQuery (лицензия MIT)
  • iro. js (публичная лицензия Mozilla 2.0)
  • Chart.js (лицензия MIT)

Разработка

Если вы пропустите какую-либо функцию или обнаружите неожиданное поведение или ошибку, не стесняйтесь создавать проблемы на GitHub.
Пожалуйста, ознакомьтесь с документацией по соответствующей теме и сначала найдите существующие отчеты о проблеме на GitHub.

Если вы хотите помочь с разработкой Smart Home Connect , ваши запросы на вытягивание всегда приветствуются.

Настроить среду разработки для SHC очень просто:
Клонируйте репозиторий git и установите зависимости для разработки, перечисленные в requirements.txt (+ модуль python-rtmidi , если вы хотите запустить MIDI-тесты).
К ним относятся все зависимости smarthomeconnect со всеми дополнениями:

 git clone https://github.com/mhthies/smarthomeconnect
компакт-диск умный дом
pip3 установить -r требования.txt
pip3 установить python-rtmidi
 

Вы можете использовать виртуальную среду, чтобы не испортить свои пакеты Python.

Кроме того, вам потребуются NodeJS и NPM на вашем компьютере для загрузки и упаковки файлов ресурсов интерфейса веб-интерфейса.
Используйте следующие команды, чтобы загрузить все внешние зависимости из NPM и упаковать их в /shc/web/static (с помощью Parcel.js):

 npm install
npm запустить сборку
 

При работе с самими исходными файлами веб-интерфейса (которые расположены в web_ui_src ), вы, вероятно, захотите запустить Parcel.js в режиме мониторинга, обеспечивая автоматическую переупаковку и перезагрузку при каждом изменении:

 npx посылка web_ui_src/main.js --dist-dir shc/web/static/ пакет --public-url ./
 

Пожалуйста, убедитесь, что все модульные тесты пройдены при отправке запроса на включение:

 python3 -m unittest
 

Для веб-тестов в вашей системе должны быть установлены Firefox и geckodriver , а также внешние ресурсы.

Кроме того, я хотел бы поддерживать высокий уровень покрытия тестами.
Чтобы проверить это, вы можете определить это локально, используя покрытие инструмент:

 покрытие run -m unittest
покрытие html
 

Удивительные библиотеки домашней автоматизации для Python | Майк Райли | The Pragmatic Programmers

Изображение от Pixel-Shot на Shutterstock

Перейти к следующему

Domotics Проект

Опубликовано в

·

4 мин чтения

·

2 ноября 5, 2021

🎁 Черная пятница Распродажа. Наша ежегодная распродажа продлится до 29 ноября., 2021 г., сэкономьте 40% на электронных книгах на веб-сайте The Pragmatic Bookshelf, используя код turkeysale2021 . Ко Дню Турции мы представляем все книги по Python, а также все книги по оборудованию, хобби и дому, включая новую книгу Майка Райли Portable Python Projects.

Я всегда нахожусь в поиске новых и интересных библиотек для своих проектов Python. Одна конкретная категория, которую я ищу, — это библиотеки домашней автоматизации. Ниже перечислены наиболее полезные библиотеки Python для домашней автоматизации, перечисленные в алфавитном порядке, которые я использовал в своих проектах.

Home Assistant

Home Assistant — это огромный фреймворк Python, который позволяет управлять разнообразным оборудованием и службами домашней автоматизации. Он может интегрироваться с устройствами Amazon Alexa, Google Assistant, Lutron, Philips Hue, Plex, Sonos, Z-wave и Zigbee — и это лишь некоторые из них. Сценарии определяются в файлах YAML, которые вызывают или запускают целевые службы, такие как включение света в определенной последовательности. Установите библиотеку с помощью следующей команды pip:

$ pip install homeassistant

Pyecobee API Wrapper

API ecobee можно использовать для управления рядом встроенных термостатов ecobee (). Хотя Home Assistant предлагает интеграцию экоби, иногда все, что вам нужно, это проверить температуру. Оболочка API pyecobee предоставляет интерфейс Pythonic для вызова объектов ecobee JSON для запроса и управления устройством. Установите оболочку с помощью следующей команды pip:

$ pip install pyecobee

phue Библиотека Philips Hue Python

Одной из наиболее часто используемых библиотек домашней автоматизации в моем наборе инструментов Python является phue. Phue — это интерфейс Pythonic, используемый для связи с аппаратным обеспечением Philips Hue Bridge, тем самым управляя всеми устройствами Hue, связанными с этим мостом. Благодаря простой настройке и структуре команд для выдачи команд Hue, phue позволяет легко создавать сложные сценарии Python для управления каждым аспектом вашей среды с аксессуарами Philips Hue. Я обращался к библиотеке phue в нескольких проектах, описанных в моей книге по домашней автоматизации Python, Портативные проекты Python . Установите пакет phue с помощью следующей команды pip:

$ pip install phue

PushNotif (уведомитель IfTTT)

PushNotif — это относительно молодая и базовая библиотека проектов Python, которая использует службу IFTTT и сопровождающее ее бесплатное приложение для Android или iOS. использовать push-уведомление этой службы для отправки и отображения всплывающего оповещения на вашем телефоне. Хотя такие уведомления можно отправлять по электронной почте, в текстовом сообщении или через службы чат-ботов, размещенные в Discord или Slack, для работы этих служб требуется дополнительный код и настройка. Если все, что вам нужно, это что-то вроде простого всплывающего окна, отображаемого на вашем телефоне, когда, скажем, температура в вашем подвале падает ниже 60 градусов по Фаренгейту, датчик температуры, подключенный к Pi, может вызвать сообщение PushNotif и использовать вашу учетную запись IFTTT и связанные приложение для мобильного телефона, чтобы предупредить вас. Установите библиотеку PushNotif с помощью следующей команды pip:

$ pip install pushnotif

Управление саундбаром PyVizio

Телевизоры и саундбары Vizio SmartCast — это бюджетные продукты для домашних развлечений, функции управления которыми доступны через WiFi. Vizio предлагает бесплатное мобильное приложение для управления своими продуктами SmartCast, но его интерфейс, на мой взгляд, неуклюжий и довольно уродливый. Кроме того, я бы предпочел управлять этими устройствами через Alexa или Google Voice, что на момент публикации этой статьи планируется, но пока официально не поддерживается. Используя тот же подход, который обсуждался в голосовых проектах в моей книге, я использую Google Voice для включения и выключения телевизора Philips (через ИК-порт) и сопровождающей его звуковой панели Vizio (через WiFi), держа телефон в кармане и защищая глаза. из этого уродливого приложения Vizio. Чтобы установить библиотеку pyvizio, используйте следующую команду pip:

$ pip install pyvizio

Samsung Smart TV

Владельцы популярного семейства дисплеев Samsung TV с подключением к Wi-Fi могут управлять этими телевизорами с помощью оболочки samsungtvws Samsung Smart TV WS API. Подобно другим оболочкам API, описанным в этой статье, этот проект Python предоставляет интерфейс Pythonic для открытого API производителя, упрощая регистрацию и управление устройством из сценария Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *