Превращаем старый iPad в умную фоторамку

По заголовку статьи может показаться, что здесь нет совсем ничего сложного или интересного. Ведь для превращения iPad в фоторамку как будто бы достаточно просто открыть на нем приложение Фото в режиме слайдшоу. И с одной стороны это даже так. Но мне захотелось сделать по-настоящему умную фоторамку: с облачной синхронизацией, интеграцией с умным домом, автоматическим включением и выключением. А также хотелось, чтобы девайс выглядел не как старый планшет, а как настоящая фоторамка, и хорошо смотрелся на полке. И вот это вот всё было уже намного сложнее.

13469baec97670f8746b21fcbe5198f6.jpgДисклеймер 1

Делал я всё примерно год назад, но до статьи добрался только сейчас. Поэтому все шаги восстанавливал по итоговому результату, памяти и заметкам. Если кто-то захочет повторить мой результат, но наткнется на какие-нибудь мелкие несостыковки — пишите, попробую помочь.

Дисклеймер 2

Инструкция должна быть валидна для iPad 3. Для других версий планшета процесс может отличаться как совсем чуть-чуть, так и очень значительно. Поэтому опять же, если будут проблемы — пишите, попробую помочь.

Около года назад я гостил у родителей и наткнулся на свой старенький iPad 3-го поколения (последний с разъемом 30-pin). Девайс провалялся без дела несколько лет, но после постановки на зарядку на удивление включился, заработал и даже смог держать заряд батареи. Работал он под iOS 9.3.5 и заметно подлагивал. Немного поиграв на нем в чудом сохранившуюся Flappy Bird, я решил забрать его и под что-нибудь приспособить. Думать долго не пришлось: у меня дома была старая дешевая цифровая фоторамка с маленьким и плохим экраном. Я решил, что iPad для этих целей подойдет куда лучше.

К фоторамке я сформулировал несколько основных требований:

  1. Требование: Фоторамка должна поддерживать облачную синхронизацию фотографий. В идеале должна быть простая возможность добавлять в нее новые фотки прямо с телефона.
    Решение: Я просто решил использовать iCloud и общие альбомы. Можно прямо со своего iPhone добавлять новые фото в нужный альбом, и они появятся на фоторамке.

  2. Требование: Жена тоже должна иметь возможность добавлять фотографии на фоторамку.
    Решение: Просто шарю ей общий альбом iCloud.

  3. Требование: Фоторамка должна отображать фото в режиме слайдшоу со случайным перемешиванием.
    Решение: Я решил использовать стандартное приложение Фото в режиме слайдшоу. В новых версиях iPadOS этот режим куда-то пропал, но в старых он есть.

  4. Требование: Фоторамка должна уметь сама включаться и выключаться по времени, чтобы не светить ночью. Также неплохо бы иметь возможность удаленного включения/выключения.
    Решение: Автоматизации даже в последних iOS достаточно ущербны, что уж говорить про iOS 9 и ниже, где нет даже приложения Команды. Поэтому для автоматизации действий пришлось делать Jailbreak.

  5. Требование: Планшет не должен непрерывно находиться на зарядке, это не очень хорошо для аккумулятора.
    Решение: Я решил использовать умную розетку, которая может включаться и выключаться по расписанию или по требованию.

  6. Требование: Фоторамка должна хорошо выглядеть, чтобы это не был просто старый планшет, прислоненный к стене.
    Решение: Я решил поискать что-нибудь на Aliexpress. А если не найду, то наколхозить что-нибудь самостоятельно. Спойлер: в итоге корпус был напечатан на 3D-принтере.

Итак, сформулировав для себя требования, я начал действовать:

1. Делаем Jailbreak

На просторах интернета полным полно разных способов Jailbreak старых iOS-девайсов. К тому же я много лет назад несколько раз делал Jailbreak для себя и друзей, поэтому сложностей не ожидал. Но не тут-то было.

Мемасик для привлечения внимания

Мемасик для привлечения внимания

Jailbreak iOS-устройств делится на 4 типа:

  1. Привязанный Jailbreak. После перезагрузки девайс превращается в «кирпич». Для его включения нужно подсоединить его к компьютеру и произвести Jailbreak заново.

  2. Полу-привязанный Jailbreak. После перезагрузки девайс включается, но Jailbreak отсутствует, Cydia не работает. Нужно подсоединить девайс к компьютеру и произвести Jailbreak заново.

  3. Полу-отвязанный Jailbreak. После перезагрузки девайс включается, но Jailbreak отсутствует, Cydia не работает. Нужно открыть приложение на девайсе и произвести Jailbreak заново. Если нет сертификата разработчика, то подпись приложения протухает каждые 7 дней. Нужно периодически его переподписывать.

  4. Отвязанный 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.

Итого процесс выглядит примерно следующим образом:

  1. Подключаем iPad к компьютеру.

  2. Устанавливаем на компьютер приложение Sideloadly.

  3. Скачиваем ipa-файл приложения Phoenix для Jailbreak iOS 9.

  4. Подписываем и устанавливаем приложение Phoenix на планшет через Sideloadly.

  5. Открываем на планшете Phoenix и делаем Jailbreak.

  6. Откатываем iOS до версии 8.4.1 через Legacy-iOS-Kit согласно инструкции.

  7. Скачиваем ipa-файл приложения Daibutsu для Jailbreak iOS 8.

  8. Подписываем и устанавливаем приложение Daibutsu на планшет через Sideloadly.

  9. Открываем на планшете Daibutsu и делаем Jailbreak.

Обратите внимание, что утилита Legacy-iOS-Kit при откате прошивки предлагает установить старую iOS сразу с Jailbreak. Я решил так и сделать, но тот Jailbreak почему-то не завелся. В итоге пришлось обновлять планшет обратно на 9.3.5 и повторять все шаги с самого начала.

2. Устанавливаем необходимый софт

После успешной установки Jailbreak на планшете должно появиться приложение Cydia. Для тех, кто в танке: Cydia — это альтернативный магазин приложений для iOS-устройств с Jailbreak.

Я потратил пару вечеров, чтобы настроить все автоматизации и подобрать нужный софт. Здесь просто приведу список. Понадобятся следующие приложения:

  1. Activator — приложение для автоматизации действий.

  2. FlipSwitch — плагин для автоматизации переключения WiFi, авиарежима и прочего.

  3. FileZilla — файловый менеджер.

  4. OpenSSH — либа для подключения к планшету по SSH и удаленного дебага.

  5. PreferenceLoader — системная либа для добавления стороннего софта в Настройки.

  6. SimulateKeyboard — либа для симуляции нажатия клавиш.

  7. 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 данная функция не поддерживается. Поэтому у меня долго не получалось войти в аккаунт. К счастью, на просторах интернета я нашел решение: нужно безуспешно ввести пароль, получить код подтверждения, после чего ввести на девайсе пароль с добавленным в конце кодом подтверждения.

Итого получается примерно так:

  1. Создаем новый Apple ID. Пункт опциональный, но мне так было удобнее.

  2. Входим в новый аккаунт на планшете. Если есть проблемы с двухфакторной аутентификацией, код подтверждения вводим слитно сразу вместе с паролем.

  3. Создаем новый общий альбом.

  4. Шарим общий альбом со всеми нужными аккаунтами.

  5. Добавляем в созданный альбом хотя бы одну фотографию.

  6. Отключаем на планшете автоблокировку экрана и код-пароль.

  7. Настраиваем гид-доступ.

Касательно гид-доступа. Этот режим позволяет оставить активным одно приложение и игнорировать любые нажатия на кнопки и экран. Я решил настроить сей режим, так как иногда в гости приходят друзья с маленьким ребенком, который запросто может захотеть потыкать в экран :)

4. Настраиваем автоматизацию

Для себя я решил, что всё должно работать примерно следующим образом:

Включение:

  1. Включается умная розетка, iPad начинает заряжаться.

  2. Планшет разблокируется.

  3. Открывается приложение Фото.

  4. Открывается нужный альбом в режиме слайдшоу.

  5. Активируется гид-доступ.

Выключение:

  1. Выключается умная розетка, iPad перестает заряжаться.

  2. Выключается гид-доступ.

  3. Приложение Фото закрывается.

  4. 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 на начало/окончание зарядки соответственно.

Итоговая инструкция выглядит примерно следующим образом:

  1. Правим скрипты, если нужно.

  2. Подключаемся к iPad по SFTP и кладем скрипты по пути /var/mobile/photoframe/

  3. Подключаемся к iPad по SSH и выполняем chmod +x /var/mobile/photoframe/*.sh

  4. Настраиваем Activator на запуск нужных shell-скриптов при нужных условиях. У меня это начало и конец процесса зарядки, но при отсутствии умной розетки это может быть просто определенное время суток.

  5. Дергаем скрипты через SSH, проверяем, что все работает корректно.

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

Включение фоторамки

12c1e824ee5333ec1bc3c65cb39f9bee.gif

Выключение фоторамки

0c7232004f2ddd2994bab35ff347a85e.gif

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-принтера, поэтому идея отложена до лучших времен.

Надеюсь, хоть кому-то мой опыт пригодится, и какие-нибудь другие старые планшеты обретут для себя вторую жизнь :)

© Habrahabr.ru