SergeJey

 
<<< Назад

Управление списком покупок в Google Keep с помощью колонки Яндекс

Привет,

В этой статье я приведу инструкцию по организации взаимодействия Алисы, MajordoMo и списка покупок в приложении Google Keep.

Для лучшего понимания того, что я хочу получить, небольшое видео того, как оно в итоге работает:

https://www.youtube.com/shorts/OviDFIzl_v8

Итак, на концептуальном уровне мы хотим, чтобы команда к нашему Умному Дому через Алису приводила к тому, чтоб произнесенный нами предмет попадал в список покупок.

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

  • Начнем с предварительных требований, нам понадобится:
  • Работающий сервер на базе MajorDoMo (очевидно)
  • Установленный на сервере Python с необходимыми библиотеками
  • Подключенный сервис CONNECT – для того, чтоб можно было команды с колонки доставлять в MajorDoMo
  • Приложение Google Keep, разумеется с Google Account-ом
  • Отдельный пароль для приложения Google Keep
  • Сценарий MajorDoMo для добавления заметок в Google Keep

Идём по порядку, пропуская первый пункт, т.к. cчитаем, что MajorDoMo работает.

Python

Во-первых, убедимся что Python у нас на сервере имеется. Заходим на сервер по SSH и пробуем запустить команду
python3 –version

В ответ должно быть что-то вроде:
Python 3.10.6

Это значит, что Python3 установлен. Если нет, устанавливаем (здесь я не буду приводить инструкцию к этому).

На всякий случай, проверяем, что в файле конфигурации MajorDoMo (/var/www/html/config.php) прописана используемая нами версия Python:

image-1690627851166.png

Следующим шагом проверяем установлен ли менеджер пакетов 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 связывает ваш Умный Дом с сервером connect.smartliving.ru, что, в свою очередь, позволяет интегрировать его с множеством других сервисов, работающих в Интернете, при этом вашему серверу не требуется иметь выделенный IP-адрес или особые настройки сети, чтобы внешние сервисы его “видели”. Примером такого внешнего сервиса можно считать Диалоги от Яндекса и, в частности, диалог для работы с MajorDoMo. Данный диалог активируется по имени “Дом-мажордом”. Первый запуск можно сделать сказав колонке “Алиса, запусти дом-мажордом”, после чего будет предложено связать ваш аккаунт в Connect-е с колонкой – это нужно для того, чтоб Connect понимал, на какой сервер пересылать полученные от пользователя команды. Для активации колонка скажет четырехзначный код, а сама привязка происходит путем добавления кода на сайте connect.smartliving.ru в разделе Мой кабинет -> Yandex.Dialog:

image-1690627891640.png

Для интеграторов: если вы хотите привязать колонку не к своему основному аккаунту в CONNECT-е, а к одному из тех, которыми управляете, то соответствующий подраздел также доступен в секции Мастер-контроль.

Проверить успешность привязки диалога к вашему дому можно путём отправки какой-то тестовой команды через Алису, например:

“Алиса, попроси дом-мажордом сказать привет”

На что колонка должна ответить “Принята команда сказать привет. Что-нибудь ещё?”, а фраза “сказать привет” должна появиться во внутреннем чате с системой MajorDoMo:

image-1690627914433.png

Если у кого-то возникает вопрос, можно ли избавиться от слова “дом-мажордом” или заменить его другим, то скажу что избавиться нет, а заменить его можно только путём создания собственного диалога в системе Яндекс, но это совсем другая история…

Ну а пока отлично – мы уже можем отправлять любой текст в MajorDoMo, теперь посмотрим на Google.

Google Keep

Следующим этапом подготовки будет создания пароля приложения Google Keep, чтобы использовать его для управления заметками в этом сервисе.

Перходим по ссылке https://myaccount.google.com/apppasswords и генерируем пароль для Custom приложения, в названии указываем gkeepapi:

image-1690627935182.png

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

image-1690627953113.png

Далее, нам надо понадобится ID заметки, в которую мы будет добавлять наши товары. Для этого заходим по адресу https://keep.google.com/ выбираем заметку со списком (или создаём новую) и сохраняем куда-нибудь её ID, который можно видеть в адресной строке:

image-1690627976195.png

Этот ID нам пригодится позже для сценария добавления заметок.

Теперь вернемся к MajorDoMo.

Сценарий 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:

image-1690628006224.png

В случае успеха, в вашем списке должен появиться пункт “test”

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

Заходим в раздел Объекты -> Шаблоны поведения и создаем обработчик со следующими настройками:

image-1690628029851.png

Теперь любая команда, начинающаяся со слова “купить” будет переправлена в наш сценарий.

Почти всё, остался один небольшой момент – после приема первой команды, колонка спрашивает “что-нибудь ещё?” и ждет следующую команду. Можно так и оставить, но тогда каждый следующий пункт придется произносить как “купить …”, а мне хотелось бы, чтоб я мог просто по очереди перечислять продукты. Чтобы такого добиться, мы будем использовать “контекст”, т.е. первая принятая команда будет задавать контекст покупок, а последующие исполняться уже в контексте покупок. Для этого вносим небольшую доработку в настройку шаблона:

image-1690628053427.png

Кроме этого, добавляем “дочернюю” команду к нашему шаблону:

image-1690628083743.png

Обратите внимание, что заданное в контексте ограничение в 30 секунд означает, что через это время система выйдет из контекста покупок, т.е. будет ожидать полную команду “купить…”. Если ситуация с тем, что используются разные команды не такая уж частая, то имеет смысл увеличить время контекста.

Домашнее задание

Шутка :) Скорее идеи как можно расширить эту автоматизацию:

  • Вести отдельный список дел (“Алиса, попроси дом-мажордом добавить задачу…”)
  • Отмечать выполненные дела (“Алиса, попроси дом-маждордом отметить выполнение …”)
  • Добавлять текстовые заметки (“Алиса, попроси дом-мажордом добавить заметку …”)

Ну а теперь точно всё. Делитесь своими вариантами подобных сценариев в комментариях. Удачной автоматизации! :)

Обсуждение (3) (7)

Смотрите так же:
02.07.2023 Мобильный хаб для Умного Дома
19.11.2022 Хранитель экрана для Android TV
28.08.2022 Идеи автоматизации от Рида (Smart Home Solver)
21.08.2022 Свой контент в админке
18.08.2022 Отправка изображения через say
06.08.2022 Как использовать мастер-контроль
01.08.2022 Про развитие системы
02.07.2021 Привод на окно Drivent -- интеграция и автоматизация
01.07.2021 Удобная работа с изображениями в блогах
28.12.2020 Вывод уведомлений системы на AnroidTV
20.12.2017 Первая запись

Минск, Беларусь

На форуме: sergejey

Веб-сайт:
https://connect.smartliving.ru/