Привет,
В этой статье я приведу инструкцию по организации взаимодействия Алисы, MajordoMo и списка покупок в приложении Google Keep.
Для лучшего понимания того, что я хочу получить, небольшое видео того, как оно в итоге работает:
https://www.youtube.com/shorts/OviDFIzl_v8
Итак, на концептуальном уровне мы хотим, чтобы команда к нашему Умному Дому через Алису приводила к тому, чтоб произнесенный нами предмет попадал в список покупок.
Ниже будет довольно много технических шагов и, как мне кажется, понимание их назначения и сути позволит получить большее представление о MajorDoMo в целом, что, в свою очередь, позволит создавать новые интересные сценарии автоматизации.
Идём по порядку, пропуская первый пункт, т.к. cчитаем, что MajorDoMo работает.
Во-первых, убедимся что Python у нас на сервере имеется. Заходим на сервер по SSH и пробуем запустить команду
python3 –version
В ответ должно быть что-то вроде:
Python 3.10.6
Это значит, что Python3 установлен. Если нет, устанавливаем (здесь я не буду приводить инструкцию к этому).
На всякий случай, проверяем, что в файле конфигурации MajorDoMo (/var/www/html/config.php) прописана используемая нами версия Python:
Следующим шагом проверяем установлен ли менеджер пакетов PIP:
pip –version
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
Если его нет, то устанавливаем:
sudo apt-get install python3-pip -y
Через PIP нам надо поставить необходимые пакеты для работы сценария взаимодействия с Google Keep (gkeepapi), а именно:
pip install gkeepapi
Дополнительно следует проверить установлены ли другие пакеты, необходимые для запуска python-скриптов из MajorDoMo:
apt-get install pkg-config
pip install mysqlclient
pip install timer
На этом сервер пока оставим в покое.
Если кто ещё не в курсе, сервис Connect связывает ваш Умный Дом с сервером connect.smartliving.ru, что, в свою очередь, позволяет интегрировать его с множеством других сервисов, работающих в Интернете, при этом вашему серверу не требуется иметь выделенный IP-адрес или особые настройки сети, чтобы внешние сервисы его “видели”. Примером такого внешнего сервиса можно считать Диалоги от Яндекса и, в частности, диалог для работы с MajorDoMo. Данный диалог активируется по имени “Дом-мажордом”. Первый запуск можно сделать сказав колонке “Алиса, запусти дом-мажордом”, после чего будет предложено связать ваш аккаунт в Connect-е с колонкой – это нужно для того, чтоб Connect понимал, на какой сервер пересылать полученные от пользователя команды. Для активации колонка скажет четырехзначный код, а сама привязка происходит путем добавления кода на сайте connect.smartliving.ru в разделе Мой кабинет -> Yandex.Dialog:
Для интеграторов: если вы хотите привязать колонку не к своему основному аккаунту в CONNECT-е, а к одному из тех, которыми управляете, то соответствующий подраздел также доступен в секции Мастер-контроль.
Проверить успешность привязки диалога к вашему дому можно путём отправки какой-то тестовой команды через Алису, например:
“Алиса, попроси дом-мажордом сказать привет”
На что колонка должна ответить “Принята команда сказать привет. Что-нибудь ещё?”, а фраза “сказать привет” должна появиться во внутреннем чате с системой MajorDoMo:
Если у кого-то возникает вопрос, можно ли избавиться от слова “дом-мажордом” или заменить его другим, то скажу что избавиться нет, а заменить его можно только путём создания собственного диалога в системе Яндекс, но это совсем другая история…
Ну а пока отлично – мы уже можем отправлять любой текст в MajorDoMo, теперь посмотрим на Google.
Следующим этапом подготовки будет создания пароля приложения Google Keep, чтобы использовать его для управления заметками в этом сервисе.
Перходим по ссылке https://myaccount.google.com/apppasswords и генерируем пароль для Custom приложения, в названии указываем gkeepapi:
Сохраняем себе созданный пароль и проверяем что он остался в аккаунте:
Далее, нам надо понадобится ID заметки, в которую мы будет добавлять наши товары. Для этого заходим по адресу https://keep.google.com/ выбираем заметку со списком (или создаём новую) и сохраняем куда-нибудь её ID, который можно видеть в адресной строке:
Этот ID нам пригодится позже для сценария добавления заметок.
Теперь вернемся к MajorDoMo.
В первую очередь, в разделе Объекты->Сценарии создадим сценарий добавления нового пункта в список (или снятие пометки о выполнении, в том случае, если этот пункт уже был). Я назвал сценарий google_keep_buy и ниже его исходный код:
#python
import sys
import gkeepapi
import json
USERNAME = "имя_пользователя@gmail.com" # имя пользователя Google
PASSWORD = "пароль_приложения" # пароль приложения
NOTE_ID = "вставляем ID заметки сюда" # ID заметки
n = len(sys.argv)
inJson = sys.argv[1]
params = json.loads(inJson)
searchItem = params['add']
# Initialize the client
keep = gkeepapi.Keep()
logged_in = False
# Otherwise, prompt for credentials and login
if not logged_in:
try:
print("<br>Trying to login<br>")
keep.login(USERNAME, PASSWORD)
logged_in = True
token = keep.getMasterToken()
#keyring.set_password("google-keep-token", USERNAME, token)
print("<br/>Success<pre>")
except gkeepapi.exception.LoginException as e:
print(e)
# Abort if authentication failed
if not logged_in:
print("<br>Failed to authenticate")
sys.exit(1)
gnote = keep.get(NOTE_ID)
items = gnote.items
item_found = False
change_made = False
print("Looking for:")
print(searchItem.lower())
for item in items:
checkItem = item.text.strip().lower()
if checkItem == searchItem.strip().lower():
item_found = True
print("Item found!")
if item.checked:
print("Unchecking")
item.checked = False
change_made = True
break
if not item_found:
print("Not found. Adding.")
gnote.add(searchItem, False)
change_made = True
if change_made:
print("Saving changes")
keep.sync()
Не забудьте прописать в коде ваш логин/пароль/ID в соответствующих местах в начале.
Скрипт принимает параметр add в качестве названия пункта, пытается его найти в существующем списке и добавляет, если он найден не был.
Код выше далеко не совершенен – сказать по правде, я не умею программировать на Python и собрал скрипт по примерам, но он работает, а это главное :)
Кстати, проверить работу скрипта можно запуском его по ссылке и передачей параметра add:
В случае успеха, в вашем списке должен появиться пункт “test”
Что ж, остался один пункт – обработка команды пользователя и передача её в созданный скрипт.
Заходим в раздел Объекты -> Шаблоны поведения и создаем обработчик со следующими настройками:
Теперь любая команда, начинающаяся со слова “купить” будет переправлена в наш сценарий.
Почти всё, остался один небольшой момент – после приема первой команды, колонка спрашивает “что-нибудь ещё?” и ждет следующую команду. Можно так и оставить, но тогда каждый следующий пункт придется произносить как “купить …”, а мне хотелось бы, чтоб я мог просто по очереди перечислять продукты. Чтобы такого добиться, мы будем использовать “контекст”, т.е. первая принятая команда будет задавать контекст покупок, а последующие исполняться уже в контексте покупок. Для этого вносим небольшую доработку в настройку шаблона:
Кроме этого, добавляем “дочернюю” команду к нашему шаблону:
Обратите внимание, что заданное в контексте ограничение в 30 секунд означает, что через это время система выйдет из контекста покупок, т.е. будет ожидать полную команду “купить…”. Если ситуация с тем, что используются разные команды не такая уж частая, то имеет смысл увеличить время контекста.
Шутка :) Скорее идеи как можно расширить эту автоматизацию:
Ну а теперь точно всё. Делитесь своими вариантами подобных сценариев в комментариях. Удачной автоматизации! :)