Превращаем старый iPad в умную фоторамку
По заголовку статьи может показаться, что здесь нет совсем ничего сложного или интересного. Ведь для превращения iPad в фоторамку как будто бы достаточно просто открыть на нем приложение Фото в режиме слайдшоу. И с одной стороны это даже так. Но мне захотелось сделать по-настоящему умную фоторамку: с облачной синхронизацией, интеграцией с умным домом, автоматическим включением и выключением. А также хотелось, чтобы девайс выглядел не как старый планшет, а как настоящая фоторамка, и хорошо смотрелся на полке. И вот это вот всё было уже намного сложнее.
Дисклеймер 1
Делал я всё примерно год назад, но до статьи добрался только сейчас. Поэтому все шаги восстанавливал по итоговому результату, памяти и заметкам. Если кто-то захочет повторить мой результат, но наткнется на какие-нибудь мелкие несостыковки — пишите, попробую помочь.
Дисклеймер 2
Инструкция должна быть валидна для iPad 3. Для других версий планшета процесс может отличаться как совсем чуть-чуть, так и очень значительно. Поэтому опять же, если будут проблемы — пишите, попробую помочь.
Около года назад я гостил у родителей и наткнулся на свой старенький iPad 3-го поколения (последний с разъемом 30-pin). Девайс провалялся без дела несколько лет, но после постановки на зарядку на удивление включился, заработал и даже смог держать заряд батареи. Работал он под iOS 9.3.5 и заметно подлагивал. Немного поиграв на нем в чудом сохранившуюся Flappy Bird, я решил забрать его и под что-нибудь приспособить. Думать долго не пришлось: у меня дома была старая дешевая цифровая фоторамка с маленьким и плохим экраном. Я решил, что iPad для этих целей подойдет куда лучше.
К фоторамке я сформулировал несколько основных требований:
Требование: Фоторамка должна поддерживать облачную синхронизацию фотографий. В идеале должна быть простая возможность добавлять в нее новые фотки прямо с телефона.
Решение: Я просто решил использовать iCloud и общие альбомы. Можно прямо со своего iPhone добавлять новые фото в нужный альбом, и они появятся на фоторамке.Требование: Жена тоже должна иметь возможность добавлять фотографии на фоторамку.
Решение: Просто шарю ей общий альбом iCloud.Требование: Фоторамка должна отображать фото в режиме слайдшоу со случайным перемешиванием.
Решение: Я решил использовать стандартное приложение Фото в режиме слайдшоу. В новых версиях iPadOS этот режим куда-то пропал, но в старых он есть.Требование: Фоторамка должна уметь сама включаться и выключаться по времени, чтобы не светить ночью. Также неплохо бы иметь возможность удаленного включения/выключения.
Решение: Автоматизации даже в последних iOS достаточно ущербны, что уж говорить про iOS 9 и ниже, где нет даже приложения Команды. Поэтому для автоматизации действий пришлось делать Jailbreak.Требование: Планшет не должен непрерывно находиться на зарядке, это не очень хорошо для аккумулятора.
Решение: Я решил использовать умную розетку, которая может включаться и выключаться по расписанию или по требованию.Требование: Фоторамка должна хорошо выглядеть, чтобы это не был просто старый планшет, прислоненный к стене.
Решение: Я решил поискать что-нибудь на Aliexpress. А если не найду, то наколхозить что-нибудь самостоятельно. Спойлер: в итоге корпус был напечатан на 3D-принтере.
Итак, сформулировав для себя требования, я начал действовать:
1. Делаем Jailbreak
На просторах интернета полным полно разных способов Jailbreak старых iOS-девайсов. К тому же я много лет назад несколько раз делал Jailbreak для себя и друзей, поэтому сложностей не ожидал. Но не тут-то было.
Мемасик для привлечения внимания
Jailbreak iOS-устройств делится на 4 типа:
Привязанный Jailbreak. После перезагрузки девайс превращается в «кирпич». Для его включения нужно подсоединить его к компьютеру и произвести Jailbreak заново.
Полу-привязанный Jailbreak. После перезагрузки девайс включается, но Jailbreak отсутствует, Cydia не работает. Нужно подсоединить девайс к компьютеру и произвести Jailbreak заново.
Полу-отвязанный Jailbreak. После перезагрузки девайс включается, но Jailbreak отсутствует, Cydia не работает. Нужно открыть приложение на девайсе и произвести Jailbreak заново. Если нет сертификата разработчика, то подпись приложения протухает каждые 7 дней. Нужно периодически его переподписывать.
Отвязанный Jailbreak. Можно спокойно перезагружать девайс, Jailbreak никуда не денется.
Я решил, что для моих целей нужен отвязанный Jailbreak. Так как девайс не всегда находится на зарядке, то в какой-то момент он может и сесть (например, когда уезжаешь в отпуск, а фоторамка остается выключенной пару недель). К сожалению, для iOS 9.3.5 нет непривязанного джейлбрейка. Поэтому пришлось делать откат iOS на более раннюю версию.
В отличие от Android, на iOS-девайсах нельзя просто так взять и откатить версию операционной системы. Для этого нужно либо сохранять SHSH2 ключи, либо использовать эксплойты. К счастью, для старых девайсов эксплойты есть, а для отката можно использовать Legacy-iOS-Kit (год назад эта софтина называлась iOS-OTA-Downgrader). iPad 3 можно спокойно откатить на версию 8.4.1, для которой как раз есть отвязанный Jailbreak.
Для отката прошивки сначала пришлось накатить хотя бы какой-нибудь Jailbreak на имевшуюся на тот момент версию iOS 9.3.5 (вот такой вот круговорот). Для этого я использовал Phoenix.
Phoenix устанавливается как стороннее приложение, которое нужно предварительно подписать. Для простой подписи и установки проще всего использовать приложение Sideloadly.
После отката прошивки уже можно поставить отвязанный Jailbkreak Daibutsu.
Итого процесс выглядит примерно следующим образом:
Подключаем iPad к компьютеру.
Устанавливаем на компьютер приложение Sideloadly.
Скачиваем ipa-файл приложения Phoenix для Jailbreak iOS 9.
Подписываем и устанавливаем приложение Phoenix на планшет через Sideloadly.
Открываем на планшете Phoenix и делаем Jailbreak.
Откатываем iOS до версии 8.4.1 через Legacy-iOS-Kit согласно инструкции.
Скачиваем ipa-файл приложения Daibutsu для Jailbreak iOS 8.
Подписываем и устанавливаем приложение Daibutsu на планшет через Sideloadly.
Открываем на планшете Daibutsu и делаем Jailbreak.
Обратите внимание, что утилита Legacy-iOS-Kit при откате прошивки предлагает установить старую iOS сразу с Jailbreak. Я решил так и сделать, но тот Jailbreak почему-то не завелся. В итоге пришлось обновлять планшет обратно на 9.3.5 и повторять все шаги с самого начала.
2. Устанавливаем необходимый софт
После успешной установки Jailbreak на планшете должно появиться приложение Cydia. Для тех, кто в танке: Cydia — это альтернативный магазин приложений для iOS-устройств с Jailbreak.
Я потратил пару вечеров, чтобы настроить все автоматизации и подобрать нужный софт. Здесь просто приведу список. Понадобятся следующие приложения:
Activator — приложение для автоматизации действий.
FlipSwitch — плагин для автоматизации переключения WiFi, авиарежима и прочего.
FileZilla — файловый менеджер.
OpenSSH — либа для подключения к планшету по SSH и удаленного дебага.
PreferenceLoader — системная либа для добавления стороннего софта в Настройки.
SimulateKeyboard — либа для симуляции нажатия клавиш.
SimulateTouch — либа для симуляции нажатий на экран.
Полный список установленных у меня пакетов
com.a3tweaks.flipswitch_1.0.16_iphoneos-arm.deb
com.rpetrich.rocketbootstrap_1.0.10_beta1.deb
com.saurik.substrate.safemode_0.9.6001_iphoneos-arm.deb
cydia_1.1.30_iphoneos-arm.deb
filzafilemanager_3.8.1–29.deb
libactivator_1.9.13_iphoneos-arm.deb
libsimulatekeyboard_0.1–2.deb
mobilesubstrate_0.9.6301_iphoneos-arm.deb
openssh_6.7p1–13_iphoneos-arm.deb
openssl_0.9.8zg-13_iphoneos-arm.deb
p7zip_4.57–3p_iphoneos-arm.deb
preferenceloader_2.2.6.deb
simulatetouch_0.7–17.deb
unrar_3.6.8–2p_iphoneos-arm.deb
unzip_5.52–6_iphoneos-arm.deb
zip_2.32–6_iphoneos-arm.deb
3. Настраиваем iPad, iCloud и Фото
Я создал новый Apple ID специально для фоторамки. Создал в приложении Фото новый общий альбом и пошарил его на свой основной Apple аккаунт.
Далее я попробовал подобавлять фото с телефона в созданный общий альбом. iPad прекрасно увидел добавленные фотографии.
В приложении Фото я потестировал режим слайдшоу и решил, что он вполне подходит под мои нужды.
После я произвел необходимые настройки на планшете: выключил автоблокировку экрана, настроил гид-доступ и, вероятно, сделал еще что-то по мелочи. Уже не помню :)
Единственная сложность, как ни странно, возникла со входом в новый аккаунт Apple ID. На всех своих аккаунтах я включаю двухфакторную аутентификацию, а в iOS 8 данная функция не поддерживается. Поэтому у меня долго не получалось войти в аккаунт. К счастью, на просторах интернета я нашел решение: нужно безуспешно ввести пароль, получить код подтверждения, после чего ввести на девайсе пароль с добавленным в конце кодом подтверждения.
Итого получается примерно так:
Создаем новый Apple ID. Пункт опциональный, но мне так было удобнее.
Входим в новый аккаунт на планшете. Если есть проблемы с двухфакторной аутентификацией, код подтверждения вводим слитно сразу вместе с паролем.
Создаем новый общий альбом.
Шарим общий альбом со всеми нужными аккаунтами.
Добавляем в созданный альбом хотя бы одну фотографию.
Отключаем на планшете автоблокировку экрана и код-пароль.
Настраиваем гид-доступ.
Касательно гид-доступа. Этот режим позволяет оставить активным одно приложение и игнорировать любые нажатия на кнопки и экран. Я решил настроить сей режим, так как иногда в гости приходят друзья с маленьким ребенком, который запросто может захотеть потыкать в экран :)
4. Настраиваем автоматизацию
Для себя я решил, что всё должно работать примерно следующим образом:
Включение:
Включается умная розетка, iPad начинает заряжаться.
Планшет разблокируется.
Открывается приложение Фото.
Открывается нужный альбом в режиме слайдшоу.
Активируется гид-доступ.
Выключение:
Выключается умная розетка, iPad перестает заряжаться.
Выключается гид-доступ.
Приложение Фото закрывается.
iPad блокируется.
Нормально настроить автоматизацию через штатный интерфейс Activator у меня не получилось (кто с ним работал, тот меня поймет). Поэтому все автоматизации я решил делать через *.sh-скрипты, запускаемые из Activator. При этом если автоматизировать открытие и закрытие приложений через Activator я умел и до этого, то с некоторыми вещами пришлось повозиться.
Для эмуляции нажатий на экран я в итоге нашел либу SimulateTouch, которая еще и оказалась заточена под старые экраны (не Retina), поэтому в процессе написания скриптов пришлось делать на это поправку.
Еще одна проблема возникла с эмуляцией трехкратного нажатия на кнопку «Домой» для включения/выключения гид-доступа. Почему-то все способы давали слишком высокую задержку между нажатиями. В итоге я нагуглил либу SimulateKeyboard, которая справилась с задачей.
Ниже представляю вашему вниманию свои shell-скрипты для автоматизации:
photoframe_on.sh: включение фоторамки
# Required:
# Activator
# SimulateTouch
# libSimulateKeyBoard: http://apt.thebigboss.org/onepackage.php?bundleid=kr.iolate.simulatetkeyboard
dir=$(dirname $0)
# stouch last digit: 3 right landscape, 4 left landscape
LANDSCAPE_CONST=3
# Disable WiFi for slide show
activator send switch-off.com.a3tweaks.switch.wifi
# Turn brigtness off
activator send switch-off.com.a3tweaks.switch.auto-brightness
for i in {1..20}; do activator send libactivator.screen.brightness.decrease; done
# Unlock
#activator send libactivator.lockscreen.dismiss
# Run PhotoFrame
# Kill and start Photos app
killall MobileSlideShow
sleep 1
uiopen photos-redirect://
sleep 3
stouch touch 503 755 $LANDSCAPE_CONST
sleep 0.5
stouch touch 48 38 $LANDSCAPE_CONST
sleep 2
stouch touch 359 198 $LANDSCAPE_CONST
sleep 1
stouch touch 872 43 $LANDSCAPE_CONST
sleep 0.5
stouch touch 787 286 $LANDSCAPE_CONST
sleep 2
# Enable guided access
skeyboard 12 64
skeyboard 12 64
skeyboard 12 64
sleep 2
# Turn brigtness on
activator send switch-on.com.a3tweaks.switch.auto-brightness
sleep 1
# Enable WiFi
activator send switch-on.com.a3tweaks.switch.wifi
sleep 1
$dir/photoframe_check.sh
photoframe_off.sh: выключение фоторамки
# Required:
# Activator
# SimulateTouch
# libSimulateKeyBoard: http://apt.thebigboss.org/onepackage.php?bundleid=kr.iolate.simulatetkeyboard
dir=$(dirname $0)
# stouch last digit: 3 right landscape, 4 left landscape
LANDSCAPE_CONST=3
# Turn brigtness off
activator send switch-off.com.a3tweaks.switch.auto-brightness
for i in {1..20}; do activator send libactivator.screen.brightness.decrease; done
sleep 0.5
$dir/guide_off.sh
sleep 3
# Lock device
activator send libactivator.system.sleepbutton
sleep 0.5
# Kill Photos app
killall MobileSlideShow
sleep 0.5
# Disable WiFi
#activator send switch-off.com.a3tweaks.switch.wifi
# Turn brigtness on
activator send switch-on.com.a3tweaks.switch.auto-brightness
guide_off.sh: выключение гид-доступа
# Required:
# SimulateTouch
# libSimulateKeyBoard: http://apt.thebigboss.org/onepackage.php?bundleid=kr.iolate.simulatetkeyboard
# stouch last digit: 3 right landscape, 4 left landscape
LANDSCAPE_CONST=3
# Disable guided access
skeyboard 12 64
skeyboard 12 64
skeyboard 12 64
sleep 0.5
# Passcode
stouch touch 505 596 $LANDSCAPE_CONST
sleep 0.3
stouch touch 522 541 $LANDSCAPE_CONST
sleep 0.3
stouch touch 532 488 $LANDSCAPE_CONST
sleep 0.3
stouch touch 526 412 $LANDSCAPE_CONST
sleep 1
# Disable button
stouch touch 38 37 $LANDSCAPE_CONST
photoframe_check.sh: проверка корректности включения фоторамки
# Required:
# Activator
# SimulateTouch
# libSimulateKeyBoard: http://apt.thebigboss.org/onepackage.php?bundleid=kr.iolate.simulatetkeyboard
dir=$(dirname $0)
if [ "$(activator current-mode)" != "application" ]; then
$dir/guide_off.sh
sleep 3
# Kill Photos app
killall MobileSlideShow
sleep 0.5
$dir/photoframe_on.sh
fi
Параметр LANDSCAPE_CONST нужно выставлять 3 или 4, в зависимости от того, на каком боку лежит планшет. Значение 3 соответствует положению разъема для зарядки справа. 4 — наоборот.
Выключение WiFi при включении фоторамки нужно, чтобы в приложении Фото не появлялась кнопка AirPlay. Этак кнопка смещает весь UI, а включается в зависимости от того, есть ли рядом активный AirPlay приемник.
Скрипт photoframe_check.sh я сделал, так как изредка что-то может пойти не так и фоторамка не активирует режим слайдшоу. Точную причину плавающего сбоя я так и не отдебажил, поэтому, не мудрствуя лукаво, просто повторяю процесс включения заново :)
Скрипты я положил по пути: /var/mobile/photoframe/ и настроил запуск скриптов photoframe_on.sh/photoframe_off.sh на начало/окончание зарядки соответственно.
Итоговая инструкция выглядит примерно следующим образом:
Правим скрипты, если нужно.
Подключаемся к iPad по SFTP и кладем скрипты по пути /var/mobile/photoframe/
Подключаемся к iPad по SSH и выполняем chmod +x /var/mobile/photoframe/*.sh
Настраиваем Activator на запуск нужных shell-скриптов при нужных условиях. У меня это начало и конец процесса зарядки, но при отсутствии умной розетки это может быть просто определенное время суток.
Дергаем скрипты через SSH, проверяем, что все работает корректно.
Ниже даю гифки включения и выключения фоторамки. К сожалению, пришлось пожать картинку и ускорить гифки в 2 раза, чтобы они влезли в ограничения Хабра.
Включение фоторамки
Выключение фоторамки
5. Интегрируем фоторамку в умный дом
Пункт точно опционален, так как умный дом есть не у всех.
Мой умный дом работает на основе HomeAssistant, поэтому в целом интеграция фоторамки прошла бесшовно. Добавил умную розетку и готово.
У меня это выглядит как-то так
Однако на случай, если умный дом есть, а лишней умной розетки под рукой нет, предлагаю бонусный вариант управления, из HomeAssistant через SSH:
Для начала кладем публичный ключ своего домашнего сервера с HomeAssistant на iPad в /var/root/.ssh/authorized_keys
Далее добавляем следующие строчки в configuration.yaml в HomeAssistant:
configuration.yaml
shell_command:
ssh_photoframe_on:
mkdir -p ~/.ssh; echo "PubkeyAcceptedKeyTypes +ssh-rsa" > ~/.ssh/config; ssh -i /config/ssh/id_rsa -o HostKeyAlgorithms=+ssh-rsa -o StrictHostKeyChecking=no root@192.168.2.2 "/User/photoframe/photoframe_on.sh"
ssh_photoframe_off:
mkdir -p ~/.ssh; echo "PubkeyAcceptedKeyTypes +ssh-rsa" > ~/.ssh/config; ssh -i /config/ssh/id_rsa -o HostKeyAlgorithms=+ssh-rsa -o StrictHostKeyChecking=no root@192.168.2.2 "/User/photoframe/photoframe_off.sh"
Магия с PubkeyAcceptedKeyTypes +ssh-rsa нужна, так как старая либа OpenSSH на iOS очень ограничена в плане вариантов ключей, а свежие версии SSH не готовы из коробки с ними работать. На разбор этой проблемы я убил минимум час, так до этого с подобным не сталкивался :)
В итоге останется только настроить нужный процесс автоматизации в HomeAssistant. Подробнее тут уже расписывать не буду. Думаю, если кто-то полезет в эту историю, он и так понимает, что он делает.
6. Придаем фоторамке хороший внешний вид
На предыдущих пунктах можно было бы и закончить, так как функциональнасть фоторамки полностью была готова. Но меня смущало, что всё выглядело просто как планшет с торчащим из него старым, потертым кабелем.
Проблему с кабелем я решил просто заказав с AliExpress двухметровый плетеный 30-pin кабель. А вот с корпусом пришлось повозиться чуть больше.
На просторах различных торговых площадок я никаких хороших вариантов не нашел. Поэтому было принято решение сделать корпус самостоятельно. Благо у моего друга был 3D-принтер.
Вечер был потрачен на то, чтобы я обмерил планшет со всех сторона, а друг рисовал макеты и показывал мне. В итоге мы остановились на одном варианте, а друг поставил его печататься.
Увы, от исходной проработки макетов остались лишь немного шакальные картинки из переписки. Но кому интересно, можете поглядеть :)
Картиночки макетов
Первый вариант копуса получился очень даже неплохим. Но у него имеется ряд огрехов: отверстия под кнопку «Домой» и датчик света получились немного кривоватыми, а рамки слишком толстыми.
Каюсь, я очень хотел (и до сих пор хочу) сделать копус покомпактнее и исправить пару мелких косяков, поэтому так долго затягивал со статьей. Думал писать ее уже после финального варианта.
Мы с другом даже провели вторую итерацию и напечатали второй вариант корпуса. Но в итоге я его так и не собрал, новые крепления отдельных частей корпуса оказались слишком хлипкими.
Если получится отыскать итоговые шаблоны для печати, обновлю пост и приложу их.
Бонус: неочевидные проблемы
В процессе я столкнулся с рядом неочевидных проблем, про которые с ходу так и не подумаешь. Часть я описал выше, но некоторые вещи органично в рассказ не легли, поэтому оставлю их тут:
Обнаружилась проблема при смене роутера на новый.
iPad 3 поддерживает только WPA2 при подключении WiFi. Несмотря на то что мой новый роутер позволяет делать шифрование сети WPA2/WPA3, девайс упорно не хотел подключаться к ней. Пришлось делать отдельную скрытую домашнюю сеть с шифрованием WPA2 и подключать планшет к ней.Несмотря на то что я при включении фоторамки первым делом временно выключаю WiFi, девайс все равно периодически начинает спрашивать пароль от Apple ID и игнорит дальнейшие автоматизации. Автоматическими скриптами решить это не получилось, поэтому если утром я вместо фото вижу запрос пароля, то просто перезапускаю фоторамку вручную, помогает почти в 100% случаев.
Я так и не научился заставлять девайс подхватывать новые фото в альбоме сразу после добавления, требуется перезапуск режима слайдшоу. Поэтому я либо просто жду следующего утра, либо перезапускаю фоторамку вручную.
Вместо итогов
Я очень доволен результатом. Получилось дать старенькому планшету вторую жизнь, а также я обзавелся фоторамкой с хорошим экраном и простой облачной синхронизацией фото.
До сих пор периодически возникают желания поправить корпус, уменьшив рамки и исправив огрехи. Но у друга сейчас нет 3D-принтера, поэтому идея отложена до лучших времен.
Надеюсь, хоть кому-то мой опыт пригодится, и какие-нибудь другие старые планшеты обретут для себя вторую жизнь :)