Алиса и PLC из планшета: различия между версиями
Gredin (обсуждение | вклад) |
Gredin (обсуждение | вклад) |
||
| Строка 94: | Строка 94: | ||
[[Файл:Gredin-019.png|1200px|безрамки|центр]] | [[Файл:Gredin-019.png|1200px|безрамки|центр]] | ||
''Обратите внимание - у входа Х.1 стоит белый кружок - признак инверсии входа, аналог логической операции NOT. Чтобы его установить - необходимо нажать по нужному входу правой кнопкой мыши и выбрать пункт "Инверсия".'' | ''Обратите внимание - у входа Х.1 стоит белый кружок - признак инверсии входа, аналог логической операции NOT. Чтобы его установить - необходимо нажать по нужному входу правой кнопкой мыши и выбрать пункт "Инверсия".'' | ||
Появление сигнала True (Вкл) на выходе блока AND будет свидетельствовать о необходимости включения умной розетки для зарядки планшета. Аналогичную логическую конструкцию необходимо построить и для отключения розетки - делать это будем при уровне заряда 100%, при этом обязательным условием должен быть статус розетки - незачем отключать уже отключенную розетку, равно как и незачем слать сигнал отключения на розетку, недоступную для управления (не Онлайн). Получается следующая конструкция: | |||
[[Файл:Gredin-020.png|1200px|безрамки|центр]] | |||
Появление сигнала True (Вкл) на выходе данного блока AND будет свидетельствовать о необходимости отключения умной розетки. Для непосредственного управления розеткой необходимо использовать блок "Зарядка Неона (on_off.on W)". Сигнал на запись значения, также как и с чтением, должен быть не постоянным, а импульсным - это обязательно нужно будет учесть. Вынесем блок управления розеткой и блок генератора импульсов и соединим их также как и при чтении, только не будем включать вход EN генератора импульсов константой - им мы будем управлять с помощью не хитрой логики, которую опишем чуть позже. А пока вот что у нас должно быть в программе "Зарядка неона" в целом: | |||
[[Файл:Gredin-021.png|1200px|безрамки|центр]] | |||
Поскольку блок управления розеткой должен записывать новое значение в розетку при возникновении сигнала на любом из блоков AND (8 и 13 на скриншоте выше), то достаточно их объединить блоком логической операции ИЛИ (блок OR в библиотеке BASE в разделе Логика), выход которого подать на вход EN генератора импульсов. Таким образом мы завершим всю логическую цепочку управления входом Write блока управления розеткой. | |||
[[Файл:Gredin-022.png|1200px|безрамки|центр]] | |||
Логика управления входом Value сложнее не на много. Есть в библиотеке BASE интересный раздел Переключатели, в котором в свою очередь есть подраздел Bit - возьмём в нашу программу из него блок BOOL SWITCH BOOL. Этот блок хорош, когда нам нужно выбрать из двух булевых значений одно, в зависимости от условия. Если кратко, то этот блок отображает на выходе значение входа IN1, если вход SEL = True, в противном случае - на выход подаётся значение входа IN0 (в Студии присутствует достаточно подробная справка почти по каждому блоку - достаточно встать на его строку и нажать F1). В нашем случае - если необходимо включить розетку, то на выходе блока переключателя должен быть сигнал True, в противном случае - False. Общая конструкция управления блоком "Зарядка Неона (on_off.on W)" принимает следующий вид: | |||
[[Файл:Gredin-023.png|1200px|безрамки|центр]] | |||
На этом работа с программой "Зарядка неона" завершена - было не сложно, правда? Не стесняйтесь перемещать в Студии блоки и переменные - связи при этом не разрываются, можете выставить их так, как вам нравится больше, учитываете только общее правило, что в целом блоки, находящиеся выше исполняются раньше блоков, расположенных ниже, а те, что расположены на одном уровне исполняются слева направо. Индексы над каждым блоком - как раз отображают порядок исполнения блоков, но до тех пор, пока мы не произвели сборку проекта (компиляцию) - индексы выставляются последовательно - в том порядке, в котором мы выносили в программу блоки и переменные. После сборки индексы выстроятся в реальном порядке исполнения - можем провести сборку и увидим как переиндексировал наши блоки компилятор: | |||
[[Файл:Gredin-024.png|1200px|безрамки|центр]] | |||
Новый порядок исполнения: | |||
[[Файл:Gredin-025.png|1200px|безрамки|центр]] | |||
Создадим программу "Управление светильником" и продолжим работу в ней. | |||
Версия от 08:36, 17 марта 2023
Телефон вызова экстренных служб - 112.
Преамбула
Практически у каждого из нас дома валяется один или даже несколько редко используемых гаджетов (планшет или старый смартфон), основной функцией которых является сбор пыли и медленная разрядка аккумуляторной батареи. В очередной раз наполняя энергией, разряженные до околокритического уровня аккумуляторы своих забытых гаджетов, мне захотелось сделать хотя бы один из них частью интеллекта своего, едва начавшего умнеть, дома. Выбор пал на планшет известной китайской компании, работающий под андроидом 10 версии (забегая вперёд - скажу, что сгодится совершенно любой гаджет на андроиде 8+) - ребёнок интерес к нему давно уже не проявляет и миллиарды китайских транзисторов, некогда обрабатывавшие около триллиона операций в минуту, день за днём забывают - каково это - иметь почётное в микроэлектронике звание полупроводников электрического тока.
Не желая ввергать уважаемого Читателя сего манускрипта в пучину грусти и тоски - процесс поиска хоть сколько-нибудь дружелюбного софта, способного вдохнуть в мой планшет дух Программируемого Логического Контроллера (он же - PLC), я опущу и представлю на суд - не побоюсь этого слова - (барабанная дробь) "бриллиант" юзер-фрэндли эфбиди программирования (с использованием функциональных блоков). Имея возможность подключения к умному дому Яндекса с возможностью управления любыми подключенными устройствами (любых производителей) мы получаем безграничные возможности создания самых гибких сценариев работы устройств умного дома!
Подопытные хомячки, любезно согласившиеся на бесчеловечные эксперименты, смогли пройти путь, описанный в данной статье чуть больше чем за 2 часа. Но у них были очень короткие лапки и электроды, прикреплённые к голове, на столько сильно им мешали, что на нескольких этапах мне пришлось им подсказывать - на какую кнопку необходимо нажать (не беспокойтесь - все хомячки выжили, получили вкусняшку и массу положительных эмоций от осознания своего интеллектуального роста). Но я уверен, что уважаемый Читатель будет проводить свои эксперименты в более комфортной обстановке и сможет справиться гораздо быстрее! Впереди нас ждёт несколько этапов авторизаций, которые из реальных объектов потребуют только Ваше имя, номер телефона и адрес Вашей электронной почты (звонить Вам не будут). Так что если у Вас есть пара часов свободного времени, заброшенный гаджет на андроиде 8+ и подключенные к Умному Дому Яндекса устройства, я предлагаю начать возноситься к новым знаниям!
Амбула
Процесс разработки будет производиться на ПК под Windows 11 (можно использовать ОС Windows 7+). Скачать софт можно по ссылке (ссылка) - страница описания там очень длинная и ссылка находится в самом низу - большая зелёная кнопка с текущей версией софта. Устанавливаем его со всеми параметрами по умолчанию, запускаем и сворачиваем!
Теперь сформируем запрос на получение apk-файла для нашего планшета - для этого достаточно на сайте разработчика заполнить очень короткую форму (ссылка). Высылают apk достаточно оперативно и пока мы занимаемся разработкой проекта - он у нас уже будет точно!
Перед началом работы нам осталось выгрузить информацию о наших устройствах из умного дома Яндекса. Будем считать, что все нужные нам устройства уже подключены.
Список устройств
- Умная розетка (любого производителя), которой мы будем периодически заряжать наш планшет - мы же не хотим, чтобы умный дом лишился в один "прекрасный" момент такого замечательного помощника.
- Умная лампочка с возможностью менять как яркость, так и цвет (желательно от Яндекса - YNDX-00018) - с её помощью мы научимся легко просыпаться каждое утро! Любителям детальных мануалов - на всякий случай уточню - лампочку нужно воткнуть в какой-нибудь светильник, стоящий в комнате, в которой мы обычно спим.
Выгрузка данных
Если на каком-либо этапе выгрузки вы столкнётесь с проблемами - можете обратиться на страницу поддержки данного сайта - там всё детально разъяснено.
Открываем сайт, подготавливающий данные к выгрузке (ссылка), нажимаем большую черную кнопку:

Перед Вами откроется список всех устройств, подключенных к Вашему аккаунту Умного Дома Яндекса:

Ставим галочку в первой строке - перед словом "Устройства" и жмём зелёную кнопку "Скачать блоки". В результате у нас появится файл "SmartHomeIoT.culib", который мы будем использовать в недавно установленной и свёрнутой программе. Перед тем как вернуться в неё и продолжить нашу работу - сделаем последнюю манипуляцию в открытом сайте - перейдём в раздел "Токен" и нажмём кнопку "Копировать":

На какое-то время можно вставить токен в любой текстовый редактор, чтобы не потерять - нам он понадобится немного позже.
Создание проекта
Работу с сайтом мы завершили - можно смело его закрывать и возвращаться к свёрнутой программе. При первом запуске она попросит пройти простую процедуру авторизации, в которой достаточно указать реальный адрес своей электронной почты, на которую придёт ключ активации.
В верхнем меню нажимаем кнопку "Новый" - будет открыто диалоговое окно с выбором места сохранения нашего нового проекта - я сохранил свой проект в "Мои документы" и, поскольку я планирую на базе данного проекта сделать в будущем существенное расширение функционала своего умного дома - название проекту дал "MySmartHome". Желательно сразу же после создания проекта выбрать тип контроллера, который мы будем использовать - называется он NEON.

Пусть Читателя не смущает английский язык интерфейса скриншотов - мне, в силу специфики моей работы, комфортнее работать на англоязычном софте. Русская версия ничем кроме названий элементов не отличается!
Поскольку планшет будет "всегда" на зарядке (точнее - умной розеткой мы всегда его зарядим, когда нужно) - можем выбрать достаточно маленькое значение для пункта "Период исполнения" - изначально там стоит 300 мс - установим 20.

Для ускорения разработки в данном ПО предусмотрена возможность использования виртуального контроллера (функциональностью ничем не отличающегося от того, который будет впоследствии с помощью высланного apk-файла развёрнут на планшете). Для этого в верхнем меню выберем вместо "Ethernet" - "Virtual PLC" и нажмём кнопку "Подключиться".

Процесс подключения занимает всего пару секунд и в результате в нижней части экрана у нас должны периодически моргать индикаторы Tx и Rx, отображающие процесс обмена данными между ПЛК (в данном случае виртуальным) и Студией (ПО, в котором мы разрабатываем наш проект).
Подключение выгруженных блоков
Для начала работы с устройствами Умного Дома Яндекса нам необходимо загрузить файл, сформированный на этапе "Выгрузка данных" чуть выше. Для этого открываем раздел "Библиотека проекта", выделяем корневой каталог "Библиотека проекта" и нажимаем кнопку "Загрузить элемент".

Далее выбираем наш файл, жмем "Открыть" и разворачиваем корневой каталог "Библиотека проекта" - в нем должны появиться наши блоки:

Программа 1 - Зарядка планшета
Хотя основной задачей в рамках данной статьи является создание очень умного светильника - в первую очередь стоит позаботиться о том, чтобы планшет, помогающий светильнику стать умнее, однажды не разрядился! Для этого переходим в раздел "Структура проекта", выделяем корневой раздел и создаём две новых программы - "Системная" (как не трудно догадаться - в ней будут лежать важные системные блоки) и "Зарядка неона" (неон - название программного контроллера, который мы используем).

При создании программ - они автоматически открываются в основном окне Студии - каждая в своей вкладке:

Программа "Системная" будет состоять всего из одного блока и одной переменной - переключимся в её вкладку, откроем в Студии раздел "Библиотека проекта" и вынесем из него в свободное место блок "Access token" (перетянем (drag & drop)).

Теперь необходимо создать переменную, которая будет хранить токен для только что вынесенного блока - открываем раздел "Переменные" (в верхнем меню)

Выделяем корневой раздел списка переменных, нажимаем кнопку "Добавить переменную", задаём ей какое угодно имя (допускаются как русские, так и английские символы), обязательно как на скриншоте ниже: тип данных, тип памяти, галочка "Массив" и значение размерности массива, а в поле значение - скопируем тот токен, который мы получили на последнем шаге этапа "Выгрузка данных".

Обратите внимание - раздел переменных открылся новой вкладкой, с ней нам еще предстоит работа чуть позже.
Возвращаемся на вкладку программы "Системная", нажимаем правой кнопкой мыши в свободном месте программы, не далеко от блока "Access token", в появившемся меню выбираем пункт "Добавить переменную" и в открывшемся списке выбираем созданную переменную "Токен". Переменная будет добавлена в указанное место в программе - перенесём её таким образом, чтобы она находилась левее блока "Access token". Для передачи значения переменной в блок - необходимо соединить её выход с входом блока. Для этого нажмите левой кнопкой мыши по выходу переменной - появится черная линия, соединяющая указатель мышки и выход переменной - наведите мышку на вход блока и нажмите левую кнопку мыши еще раз. Должна образоваться связь между переменной и блоком.

С программой "Системная" мы закончили - займёмся непосредственно анализом уровня заряда аккумулятора планшета и управлением умной розеткой, отвечающей за зарядку планшета. Переходим в программу "Зарядка неона". Для начала вынесем блок "Зарядка Неона (R)" из Библиотеки проекта в открытую программу "Зарядка неона". Этот блок будет считывать с умной розетки текущий статус - включена она или нет. Для активации процесса чтения на вход Update блока необходимо подать сигнал True - сигнал должен быть не постоянным - необходимо отправлять импульс, который начнет процесс чтения. Для этого в основной библиотеке BASE существует триггер "PULSE GENERATOR". Библиотека BASE находится в правой части окна Студии - необходимо её раскрыть, в ней раскрыть каталог Триггеры и перетянуть блок "PULSE GENERATOR" в открытую программу, расположив блок слева от блока "Зарядка Неона (R)". Далее необходимо соединить выход PULSE и вход Update данных блоков, после чего нажать правой кнопкой мыши по входу PERIOD генератора импульсов и, выбрав пункт в выпавшем меню "Константа", задать нужную нам периодичность генерации импульсов в миллисекундах. Не стоит здесь указывать число меньше 1000 мс (1 секунда), если на это нет острой необходимости. Аналогично константой зададим вход EN генератора импульсов во включенное положение.

Для хранения прочитанных значений создадим 2 переменные: "Зарядка Онлайн" и "Зарядка Статус". Для этого вернёмся во вкладку переменных пользователя, выделим корневой раздел, в котором будем создавать переменные и создадим две переменные типа Bool в памяти типа RAM.

Вернувшись в программу "Зарядка неона", вынесем эти переменные (правая кнопка мыши - добавить переменную) и подключим к их входам выходы блока "Зарядка Неона (R)".

Переменная "Зарядка Онлайн" теперь хранит значение того - на связи ли розетка - эту переменную обязательно нужно учитывать при решении о необходимости включать или отключать её. Переменная "Зарядка Статус" отображает - включена ли розетка (значение можно использовать только если "Зарядка Онлайн" включена).
Далее необходимо вынести в программу "Зарядка неона" блок, читающий значение уровня заряда аккумулятора нашего планшета. Этот блок находится в библиотеке SYS (в правой части интерфейса Студии) - в каталоге Neon, блок называется "U Battery". Выносим его ниже связки пульс-генератора и блока чтения статуса розетки (программа в контроллере будет исполнятся последовательно одна за другой, начиная с верхних блоков - вниз - поэтому необходимо соблюдать логическую связь между операциями). На выходе этого блока будет отображаться заряд аккумулятора планшета в процентах (1-100).
Получив процент заряда аккумулятора нам необходимо принять решение о том - необходимо ли его заряжать или, если зарядка идет - пора ли прекратить зарядку. Будем считать, что уровнем заряда, на котором необходимо включать розетку, будет 30%. Для сравнения текущего заряда и критического воспользуемся блоком из библиотеки BASE - Операции сравнения - Byte - A < B. Выносим его в программу и соединяем выход блока "U Battery" с входом А блока сравнения. Вход В зададим константой - значение 30. Дополнительно вынесем (или скопируем (выделить с зажатым ctrl, а затем ctrl+c, ctrl+v) уже вынесенные выше) 2 переменные: "Зарядка Онлайн" и "Зарядка Статус". Логическим соединением получившихся трех значений будет следующее: если Зарядка Онлайн = True (в русской версии Вкл) И Зарядка Статус = False (Откл) И Заряд < 30%, тогда включаем розетку. За битовую операцию И отвечает блок из библиотеки BASE - Битовые операции - Логика - AND. Выносим его и соединяем с блоком сравнения и двумя переменными. Поскольку входов у блока AND изначально всего 2 - нам необходимо его расширить - эта операция допустима с входами, являющимися массивами (у блока AND вход - как раз массив). Жмем правой кнопкой мыши по входу блока AND, выбираем пункт меню "Кол-во элементов" и указываем значение 3. Подключаем входы следующим образом:

Обратите внимание - у входа Х.1 стоит белый кружок - признак инверсии входа, аналог логической операции NOT. Чтобы его установить - необходимо нажать по нужному входу правой кнопкой мыши и выбрать пункт "Инверсия".
Появление сигнала True (Вкл) на выходе блока AND будет свидетельствовать о необходимости включения умной розетки для зарядки планшета. Аналогичную логическую конструкцию необходимо построить и для отключения розетки - делать это будем при уровне заряда 100%, при этом обязательным условием должен быть статус розетки - незачем отключать уже отключенную розетку, равно как и незачем слать сигнал отключения на розетку, недоступную для управления (не Онлайн). Получается следующая конструкция:

Появление сигнала True (Вкл) на выходе данного блока AND будет свидетельствовать о необходимости отключения умной розетки. Для непосредственного управления розеткой необходимо использовать блок "Зарядка Неона (on_off.on W)". Сигнал на запись значения, также как и с чтением, должен быть не постоянным, а импульсным - это обязательно нужно будет учесть. Вынесем блок управления розеткой и блок генератора импульсов и соединим их также как и при чтении, только не будем включать вход EN генератора импульсов константой - им мы будем управлять с помощью не хитрой логики, которую опишем чуть позже. А пока вот что у нас должно быть в программе "Зарядка неона" в целом:

Поскольку блок управления розеткой должен записывать новое значение в розетку при возникновении сигнала на любом из блоков AND (8 и 13 на скриншоте выше), то достаточно их объединить блоком логической операции ИЛИ (блок OR в библиотеке BASE в разделе Логика), выход которого подать на вход EN генератора импульсов. Таким образом мы завершим всю логическую цепочку управления входом Write блока управления розеткой.

Логика управления входом Value сложнее не на много. Есть в библиотеке BASE интересный раздел Переключатели, в котором в свою очередь есть подраздел Bit - возьмём в нашу программу из него блок BOOL SWITCH BOOL. Этот блок хорош, когда нам нужно выбрать из двух булевых значений одно, в зависимости от условия. Если кратко, то этот блок отображает на выходе значение входа IN1, если вход SEL = True, в противном случае - на выход подаётся значение входа IN0 (в Студии присутствует достаточно подробная справка почти по каждому блоку - достаточно встать на его строку и нажать F1). В нашем случае - если необходимо включить розетку, то на выходе блока переключателя должен быть сигнал True, в противном случае - False. Общая конструкция управления блоком "Зарядка Неона (on_off.on W)" принимает следующий вид:

На этом работа с программой "Зарядка неона" завершена - было не сложно, правда? Не стесняйтесь перемещать в Студии блоки и переменные - связи при этом не разрываются, можете выставить их так, как вам нравится больше, учитываете только общее правило, что в целом блоки, находящиеся выше исполняются раньше блоков, расположенных ниже, а те, что расположены на одном уровне исполняются слева направо. Индексы над каждым блоком - как раз отображают порядок исполнения блоков, но до тех пор, пока мы не произвели сборку проекта (компиляцию) - индексы выставляются последовательно - в том порядке, в котором мы выносили в программу блоки и переменные. После сборки индексы выстроятся в реальном порядке исполнения - можем провести сборку и увидим как переиндексировал наши блоки компилятор:

Новый порядок исполнения:

Создадим программу "Управление светильником" и продолжим работу в ней.