|
pyLightpack
Описание класса-обёртки для языка Python, который сильно упрощает работу с API Лайтпака
Phase-Implementation, Featured ВведениеpyLightpack -- это набор определений и методов для языка Python, которые сильно упрощают процесс взаимодействия с API и написание плагинов для Лайтпака. Например, код простейшего скрипта, который будет плавно включать и гасить ярко-зелёную подсветку может выглядеть так: import lightpack, time # Подключаем необходимые внешние модули
lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'IDDQD') #Создаём объект и настраиваем его
lpack.connect() # Подключаемся к серверу API
lpack.lock() # Передаём управление от софта в скрипт
lpack.setSmooth(100) # Устанавливаем необходимую степень плавности смены цветов
while True :
lpack.setColorToAll(0,255,0) # Яркость зелёного канала всех светодидов на максимум
time.sleep(1) # Ждём секунду
lpack.setColorToAll(0,0,0) # Выключаем все каналы всех светодиодов
time.sleep(1)"Живьём" этот и некоторые другие выполненные на скорую руку эффекты выглядят так:
Этот документ содержит описание методов и некоторые примеры работы с ними. Для начала работы, неплохо было бы кратко ознакомиться с возможностями API, установить Python 2.7, положить файл lightpack.py в одну папку с вашим будущим скриптом-плагином. Если Python для вас в новинку, то есть смысл держать под рукой один из справочников-туториалов. Этот язык крайне гибок, но некоторые синтаксические конструкции могут казаться на первый взгляд неочевидными. Если читать справку лень, а запустить скрипт хочется, то для совсем быстрого старта помимо вышеописанных рекомендаций нужно проделать следующее:
Не забывайте, что прервать выполнение Python-программы в любой момент из консоли можно посредством сочетания клавиш Ctrl+C. В примерах часто используются бесконечные циклы, так что это сочетание вам может пригодиться. Структура Python-скриптаИз примера выше можно понять, что базовая структура скрипта выглядит следующим образом: < Подключение внешних модулей > < Создание объекта lightpack.lightpack() и его настройка > < connect() > < lock() > ... < Основное тело скрипта > ... < unlock() или disconnect() > При этом у вас остаётся возможность использовать всю мощь и гибкость Питона вкупе с бездной внешних модулей для него. При этом плагины существуют параллельно с режимами управляющего софта Лайтпака (см. метод lock()) и не исключают друг друга. В нашем репозитории некоторые примеры плагинов с использованием pyLightpack находятся в соответствующей папке. Если по каким-то причинам Python вас не устраивает, вы можете работать напрямую с "низкоуровневым" API, или даже написать собственную обёртку (wrapper) под любимый язык. Если так, то не забудьте поделиться ей с нами.) Базовые методыОписание основных методов необходимых для подключения к API и управления приоритетами. lightpack.lightpack()Аргументы: host, port, ledMap, APIkey Конструктор, который создаёт объект. В качестве аргументов передаются настройки. host -- адрес машины на которой запущен управляющий софт Лайтпака. В случае если машина та же, на которой вы запускаете скрипт, то нужно указать 127.0.0.1 или localhost. port -- адрес TCP-порта который слушает сервер (по умолчанию 3636). ledMap -- массив для ремаппинга вашей светодиодной конфигурации. Не секрет, что при установке Лайтпака все пользователи используют разную конфигурацию светодиодов. Кто-то подсвечивает только боковые грани монитора, кто-то весь периметр. Кто-то использует 8 светодиодов, кто-то 10, а некоторые и вовсе светодиодные ленты. При этом светодиоды располагаются в произвольном порядке. Поэтому после настройки управляющего софта виджеты захвата в нём стоят не по порядку. И для установки цвета на конкретный светодиод из API вам нужно знать его номер (открыть настройки и посмотреть на номер виджета соответствующего нужному светодиоду). Именно для устранения этого неудобства мы ввели массив ремаппинга. Для того чтобы правильно заполнить этот массив, нужно сделать следующее:
Теперь, когда вы будете устанавливать цвета через API вам нужно будет просто помнить положение стартового светодиода, к которому вы сможете обращаться как к первому, следующий за ним по часовой стрелке будет вторым и т.д. APIkey -- ключ авторизации для API-сервера. Его можно сгенерировать или отредактировать в соответствующем разделе программы захвата. Ключ нужен для простейшей защиты от несанкционированного использования API через сеть. Тем не менее, в программе есть возможность отключить авторизацию внешних скриптов и плагинов. В этом случае аргумент в конструкторе можно просто опустить. lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey') connect()Аргументы: нет Через механизм сокетов при помощи этого метода осуществляется подключение к заданному в конструкторе порту по заданному в конструкторе адресу. Так же производится посылка серверу ключа авторизации, если он задан. Если попытка не удаётся (например, управляющий софт Лайтпака не запущен), то в консоли вы увидите предупреждение Lightpack API server is missing. lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey')
lpack.connect()lock()Аргументы: нет Метод передаёт контроль над устройством от программы захвата вашему внешнему скрипту. До тех пор пока не выполнена эта команда, через API могут выполняться лишь GET-команды. Именно благодаря этому простейшему механизму передачи приоритета становится возможным полноценно использовать все фичи основной программы захвата в ваших скриптах. Например, из скрипта вы можете вклиниваться (выполняя lock()) в основной режим работы программы (захват или подсветку), отрабатывать набор действий и затем передавать приоритет обратно управляющей программе. lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey')
lpack.connect()
lpack.lock()unlock()Аргументы: нет По аналогии с предыдущим методом возвращает приоритет обратно управляющей программе. За одну сессию установленную при помощи связки connect() / disconnect() можно сколько угодно раз использовать конструкцию lock() / unlock() lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey')
lpack.connect()
lpack.lock()
... # Основная часть вашего скрипта
lpack.unlock()disconnect()Аргументы: нет Отключает внешний скрипт от порта, который слушает API и закрывает все соединения с ним. Тем самым завершает сеанс связи с API. Никакие команды для управления Лайтпаком после disconnect() послать не получится. pyLightpack одновременно с закрытием соединения производит ещё и unlock() на тот случай, если пользователь забыл сделать это самостоятельно. lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey')
lpack.connect()
lpack.lock()
... # Основная часть вашего скрипта
lpack.unlock()
lpack.disconnect()GET-методыНабор методов для получения обратной связи от управляющего софта. Не передают аргументы и лишь возвращают значения. Все GET-команды могут быть выполнены сразу после подключения к API -- выполнять предварительно lock() не обязательно. getProfile()Возвращаемые значения: имя текущего профиля Возвращает имя текущего активного профиля управляющего софта. Пример ниже выводит название профиля в консоль. lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey')
lpack.connect()
print (lpack.getProfile)
lpack.disconnect()getProfiles()Возвращаемые значения: список имён всех профилей По аналогии с предыдущим методом возвращает полный список доступных профилей из папки Profiles разделённый точкой с запятой. getStatus()Возвращаемые значения: on, off Возвращает флаг (строку) состояния Лайтпака, как оно отражено в настройках программы. Флаг соответствует кнопке "вкл/выкл Лайтпак". В зависимости от того выключено или включено сейчас устройство в настройках управляющего софта (а не физически!), метод возвращает off и on, соответственно. ...
if lpack.getStatus() == 'off' :
print ('Lightpack is turned off now')
lpack.disconnect()
...getAPIStatus()Возвращаемые значения: idle, busy Возвращает флаг (строку) готовности API к внешнему подключению, которое регулируется парой команд lock() / unlock(). В том случае, если API свободен и готов перейти под управление вашего скрипта/плагина возвращает idle. ... if lpack.getAPIStatus() == 'idle' : lpack.lock() ... getCountLeds()Возвращаемые значения: кол-во зон захвата Возвращает общее количество всех зон захвата (активных и отключенных) в текущем профиле. Актуально для устройств типа Adalight для которых программа позволяет устанавливать произвольное количество зон захвата. SET-методыМетоды предназначены для того, чтобы передавать команды в порт, с последующим исполнением их на устройстве. turnOn()Аргументы: нет Метод включает Лайтпак в том случае, если он был выключен в настройках управляющего софта. После его выполнения метод getStatus() будет возвращать on. turnOff()Аргументы: нет По аналогии с предыдущим, метод выключает Лайтпак в том случае, если он был включен в настройках управляющего софта. После его выполнения метод getStatus() будет возвращать off. setProfile()Аргументы: имя профиля Метод включает заданный профиль из списка доступных (см. getProfiles()). ...
prof = getProfiles()
if prof.index('test07') >= 0 : # Если в списке вернувшихся профилей есть test07
lpack.lock()
lpack.setProfile('test07') # то включаем его
lpack.unlock()
...setColor()Аргументы: n, r, g, b Метод устанавливает заданный цвет для заданного светодиода. При смене цвета учитываются текущие настройки профиля управляющего софта (степень плавности, гамма-коррекция и пр.) n -- номер светодиода в массиве ремаппинга (см. конструктор lightpack.lightpack()). r, g, b -- значения яркости каждого из каналов светодиода в промежутке от 0 до 255. Пример зажигает чётные светодиоды синим цветом, а нечётные красным: ...
for i in range (1, 11) : # Повторяем от 1 до 10
if i % 2 == 0 : # Если i чётное, то
lpack.setColor(i, 255, 0, 0) # Устанавливаем на i-ый светодиод красный цвет
else :
lpack.setColor(i, 0, 0, 255) # А если не чётное, то синий
...setColorToAll()Аргументы: r, g, b По аналогии с предыдущим методом устанавливает цвет на все светодиоды из массива ремаппинга. Аргумент, указывающий на номер светодиода отсутствует. setGamma()Аргументы: значение гамма-коррекции от 0.01 до 10.00 Устанавливает значение гамма-коррекции. Аналог соответствующей настройки в управляющем софте. Значение гамма-коррекции -- число в диапазоне от 0.01 до 10.00. Если отправленное значение будет находиться за границами этого диапазона от сервера в консоль придёт строка error. Значение гамма-коррекции устанавливается для всех светодиодов одновременно. setSmooth()Аргументы: значение степени плавности от 0 до 255 Устанавливает степень плавности смены цветов устройством. Аналог соответствующей настройки в управляющем софте. Значение степени плавности -- число в диапазоне от 0 до 255. Чем больше, тем плавнее изменяется цвет между двумя заданными. Если вы передадите значение выше или ниже допустимых границ диапазона, то API выставит максимально или минимально возможное, соответственно. Значение плавности устанавливается для всех светодиодов одновременно. setBrightness()Аргументы: значение общей яркости в диапазоне от 0 до 100 Устанавливает степень яркости для всех светодиодов устройства одновременно в диапазоне от 0 (подсветка выключена) до 100. Аналог соответствующей настройки в управляющем софте. Пример использованияДля полноты понимания есть смысл рассмотреть настоящий скрипт. Приведённый скрипт один раз в 30 секунд подключается к вашему почтовому ящику на сервере gmail.com через протокол IMAP используя внешний модуль imaplib. Получив общее количество писем в ящике и количество непрочитанных скрипт запускает "змейку" по Лайтпаку в том случае, если есть хотя бы одно непрочитанное сообщение. Прокрутив змейку 8 кругов, скрипт передаёт приоритет действий управляющему софту и ждёт 30 секунд перед следующей проверкой почты. Пример анимации реализован без обратной связи и во многом избыточен. Зато он позволит вам оценить скорость посылки данных через API. import lightpack, time, imaplib, re, getpass
def gmail_checker(username,password): # Определяем метод для парсинга данных
i=imaplib.IMAP4_SSL('imap.gmail.com')
try:
i.login(username,password)
x,y=i.status('INBOX','(MESSAGES UNSEEN)')
messages=int(re.search('MESSAGES\s+(\d+)',y[0]).group(1))
unseen=int(re.search('UNSEEN\s+(\d+)',y[0]).group(1))
return (messages,unseen)
except:
return False,0
lpack = lightpack.lightpack('127.0.0.1', 3636, [2,3,6,7,8,9,10,4,5,1], 'mySecureAPIkey') # Создаём объект
lpack.connect() # Соединяемся с API
mail = raw_input('Gmail: ') # Запрашиваем e-mail
passwd = getpass.getpass('password: ') # И пароль (маскируется)
while True :
messages,unseen = gmail_checker(mail,passwd) # Проверяем почту
print "%i messages, %i unseen" % (messages,unseen) + ' @ ' + time.ctime()
if unseen > 0 : # Если есть непрочитанные, то
lpack.lock() # Передаём управление скрипту
lpack.setColorToAll(0,0,0) # Выключаем все светодиоды
time.sleep(2) # Ждём пару секунд (вдруг плавность максимальная)
lpack.setSmooth(8) # Снижаем плавность
i = 1
while i < 80 : # Повторяем 8 полных кругов
i = i+1
for k in range (0, 10) :
idx = (i+k) % 10 # Остаток от деления суммы счётчиков на 10
if k < 3 : # Длина змейки -- 4 светодиода
lpack.setColor(idx,255,0,0)
else :
lpack.setColor(idx,0,0,125)
time.sleep(0.05)
lpack.unlock()
time.sleep(30);
|
Не совсем понятно как запускать скрипты. Напишите пожалуйта мне, новичку в этом деле, пошагово как запустить скрипт, в остальном я разберусь. Установил Питон 2.7, скопировал lightpack.py и скрипт, который будет плавно включать и гасить ярко-зелёную подсветку, запускаю его (green.py) запускается на миг черное DOSовское окошко и все(. Что я делаю непраивльно?
надо открыть консоль и оттуда набирать python lightpack.py
или
./python lightpack.py для никс систем
Да, вы правы. Позже немного расширю описание для совсем новичков. А пока вот: 1. Собираете из последних исходников управляющий софт Лайпака и запускаете программу 2. Ставите Питон (на самом деле версия 3+ тоже должна работать, просто я не проверял), в папку с вашим скриптом кладёте lightpack.py 3. Если файлы с расширением .py у вас ассоциированы с интерпретатором (обычно это происходит при установке по умолчанию), то даже /python в консоли набирать не нужно 4. Открываете консоль (в винде run->cmd), перебираетесь в директорию с вашим скриптом (командами cd и иже с ними) 5. Выполняете оттуда /moi_script.py и смотрите на результат.
Да, чуть не забыл: Прервать выполнение скрипта в любое время из консоли под Вин можно по сочетанию Ctrl+C . В примерах используются бесконечные циклы, так что используйте это сочетание, как универсальный выход.
Разумеется, позже мы добавим поддержку скриптов-плагинов прямо в GUI программы. Для того, чтобы пользоваться ими могли даже те, кто не хочет их писать. Но пока всё вот так -- неудобно и вручную.)
Вот, первое условие я и пропусти - пытался запустить на http://code.google.com/p/lightpack/source/detail?r=00adff974228 ревизии. Смотрю в последнее время активно идет работа над API, когда примерно можно будет ждать "удобного" интерфейса и будет ли он под 4.3 версию или основной упор идет на 5?
Работы над API мы зафиксировали и свернули до крупного релиза софта, который надеюсь произойдёт на следующей неделе (там же представим и существующий API). В нем не будет возможности подключать плагины из GUI, но это наш следующий шаг при работе над API. Что касается версий -- следующий релиз будет последним для железа 4.3, дальше весь упор будет сделан на пятёрку. Вики по железке обновится сразу после старта продаж устройства, сейчас на это попросту нет времени. Думаю это вопрос пары недель.
API для написания внешних плагинов и скриптов (на днях будет отдельный пост) Очень ждем! bravo
Когда планируется релиз софта и прошивки 4 версии с поддержкой api из gui?
Релиз уже был, все есть здесь http://code.google.com/p/lightpack/downloads/list
Нет, похоже тут вопрос о поддержке плагинов из GUI. Работы над этой штукой начнутся, думаю, не раньше, чем через три недели. Программисты тоже люди и разбежались по отпускам.)
Не терпится написать визуализацию для аимпа, только я даже незнаю с чего и начать. Можно использовать вот эту библиотеку http://habrahabr.ru/blogs/python/126262/ для упрощения запросов к МК? Напишите, пожалуйста, примерный алгоритм действий
Я думаю, вот это ответит на ваши вопросы - http://code.google.com/p/lightpack/wiki/API
Здравствуйте. Обновился до последней 5.8.6-1 версии, но поддержку плагинов из GUI так и не увидел.. Планируется ли ее реализация или вы отказались от этой идеи?
Ни разу не отказались. Планируем вначале решить более злободневные задачи.
Подскажите, пожалуйста, как скачать файл lightpack.py??? Нажимаю на ссылу и мне высвечивает: 404. That’s an error. The requested URL /p/lightpack/source/browse/Software/apiexamples/lightpack.py was not found on this server. That’s all we know. Как скачать файл???