- PVSM.RU - https://www.pvsm.ru -

Это история о том, как я превратил свой старый iPhone 8 в OCR-сервер на солнечных батареях, используя фреймворк Apple и зарядную станцию EcoFlow River 2 Pro. Он месяцами напролёт работает в режиме 24/7, обрабатывая тысячи изображений на полностью автономном питании.
За год с лишним мой сервер обработал 83 418 запросов на распознавание текста (OCR) и 48 ГБ изображений, используя только фреймворк Apple Vision и возобновляемую энергию. Большинство людей после апгрейда закидывают свои старые iPhone в ящик. Но не я. Я превратил свой телефон в сервер, который экономит мои деньги, работая полностью автономно.
Мог ли я просто запустить этот сервер на своём маке, как нормальный человек? Конечно же. Но разве это весело?
iPhone 8 с приложением на SwiftUI, поддерживающим Apple Vision OCR.
EcoFlow River 2 Pro (768 Вт/ч) + солнечная панель 220 Вт (GearScouts [1]).
Мини-ПК, обрабатывающий веб-сервисы и маршрутизацию API.
Сеть Tailscale, объединяющая всё.
83 418 OCR-запросов и 48 ГБ изображений обработано.
1000+ запросов в загруженные дни.
Батарея телефона после интенсивной работы сохранила 76% ёмкости.
$84-120 CAD экономии на электричестве в год.
Apple Vision не уступает по точности облачным службам.
Старое железо на удивление уверенно справляется с серверными нагрузками.
При правильном управлении батареей солнечной энергии вполне хватает.
При больших масштабах локальная обработка выигрывает у облачных решений в стоимости, попутно обеспечивая конфиденциальность.
У меня есть личный проект по обработке большого количества изображений, который ежедневно пропускает через себя сотни картинок, автоматически разбивая их по категориям. Любой рассудительный человек запустил бы обработку OCR на своём Mac — Apple Vision прекрасно работает в macOS.
Но я не рассудителен. Я вижу прекрасный iPhone 8 и думаю: «Знаешь, что тебе нужно? Вторая жизнь в виде обработчика изображений на солнечной батарее». В периоды между туристическими выездами моя EcoFlow River 2 Pro всё равно лежала без дела, так что переключение имеющегося OCR-сервера на солнечное питание стало его естественной эволюцией.
Возможность мониторить информационную панель в реальном времени прямо на подоконнике, продолжая любоваться птицами за окном.
Автономное питание для личных проектов.
Реальная экономия, которая со временем только растёт.
Отличный повод для беседы, когда приходят гости.
Финансовая выгода невелика, но ощутима. К примеру, в мае расход составил 37.4 кВт/ч ($7.21), в апреле 45.8 кВт/ч ($8.82), то есть за год получается прилично.
«Практично ли это? Не уверен. Круто ли? Однозначно».
Вот мой мудрёный конфиг:
1. Мини-ПК, на котором работает веб-сервер, сервис обработки изображений, сервер Plex и разные другие сервисы.
2. iPhone 8, восседающий на подоконнике. На нём запущено приложение SwiftUI, которое отвечает за обработку OCR и выступает информационной панелью.
3. Зарядная станция EcoFlow поддерживает автономную работу обоих устройств.
4. Сеть Tailscale обеспечивает органичную связь всех компонентов.
Рабочий поток изящен и прост. Сервис обработки изображений отправляет эти изображения на телефон для оптического распознавания символов с помощью фреймворка Vision. Телефон обрабатывает текст, отправляет его обратно и выводит на информационную панель итоговую статистику. Я же всё это время блаженно наблюдаю за прекрасными птицами в окно, преисполненный самодовольства.
Я не покупал EcoFlow River 2 Pro специально для этого проекта. Приобрёл я её, так как поверил, что стану одним из любителей кемпингов, который много живёт на природе и нуждается в портативном питании. Хотя пока я по-прежнему больше остаюсь «домашним котом с уличными амбициями». Но моя импульсивная покупка всё же не оказалась обречена собирать пыль.

Дельный совет: если займётесь поиском портативных зарядных станций, то GearScouts.com [2] предлагает прекрасную функцию сравнения цен, которая позволит сэкономить время.
|
Компонент |
В простое |
В работе |
Примечание |
|
OCR-сервер на базе iPhone 8 |
0.5-1 Вт |
2-5 Вт |
Поразительная энергоэффективность |
|
Мини-ПК (несколько сервисов) |
15 Вт |
25-30 Вт |
Включает Plex, Archive Warriors |
|
Общее потребление в сутки |
~1.2кВт/ч |
Переменное |
На основе фактических данных с TP-Link |
Лето: 150-220 Вт в пике. Обеспечивает бесперебойную работу при заряжающейся батарее.
Осень/весна: 20-60 Вт в среднем. Работа от солнца/батареи.
Зима: 5-20 Вт в лучшем случае. Преимущественно работа от батареи (15-20 часов).
Ёмкость станции в 768 кВт/ч обеспечивает прекрасный запас с учётом непредсказуемой канадской погоды. Система управления батареями в этой станции заслуживает отдельной похвалы — она не просто подаёт ток на устройства, но и грамотно регулирует кривые заряда.
Создание сервера на iOS может показаться сложной задачей, но в Apple проделали всю основную работу. Самым трудным было убедить iOS в важности моего приложения, чтобы система не прерывала его выполнение.

Фреймворк Apple Vision воистину впечатляет и совершенно недооценён. В то время, как все были одержимы ChatGPT и облачными сервисами OCR, в Apple по тихой выпустили локальное решение для OCR, которое работает быстро, точно и полностью на устройстве.
Вот его основной код обработки:
import Vision
import UIKit
func processImage(_ image: UIImage, completion: @escaping (String?) -> Void) {
guard let cgImage = image.cgImage else {
completion(nil)
return
}
let request = VNRecognizeTextRequest { request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else {
completion(nil)
return
}
let recognizedText = observations.compactMap { observation in
observation.topCandidates(1).first?.string
}.joined(separator: "n")
completion(recognizedText)
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try? handler.perform([request])
}
По точности Vision не уступает некоторым облачным сервисам, плюс всё обрабатывает локально. Никаких вызовов API, никаких ограничений на использование, никаких рисков конфиденциальности.
Информационная панель — самое интересное. Мне нужно было, чтобы она красиво смотрелась на подоконнике и показывала статистику в реальном времени:
struct DashboardView: View {
@StateObject private var server = OCRServer()
@State private var stats = ProcessingStats()
var body: some View {
VStack(spacing: 20) {
Text("OCR Server Status")
.font(.title)
.fontWeight(.bold)
HStack {
StatCard(title: "Requests Today", value: "(stats.requestsToday)")
StatCard(title: "Total Processed", value: "(stats.totalProcessed)")
}
HStack {
StatCard(title: "Avg Processing Time", value: "(stats.avgProcessingTime)ms")
StatCard(title: "Success Rate", value: "(stats.successRate)%")
}
BatteryView(percentage: UIDevice.current.batteryLevel)
Text("Server running on port 8080")
.font(.caption)
.foregroundColor(.secondary)
}
.padding()
}
}
Я люблю вникать в данные, поэтому интегрировал Google Analytics 4. Панель показывает общее число пользователей — 139 917, число пользователей за текущий месяц — 17 643, среднюю продолжительность сеанса — 6:28 и число активных пользователей — 11. Создаётся ощущение, что у меня на подоконнике информационная панель крохотного дата-центра.
Запитывание электроники от солнечной энергии кажется простой затеей, пока не столкнёшься с погодными реалиями Канады. У нас бывает всё, что угодно — от жарких солнечных деньков (максимум трёх) до месяцами затянутого неба, когда солнечные панели оказываются не полезнее шоколадного чайника.
В итоге я выработал оптимальную схему, основанную на погоде:
Лето: солнечной энергии хватает с лихвой, и ещё остаётся на зарядку других устройств.
Осень/весна: смешанное использование солнечной энергии и батареи под внимательным контролем.
Зима: питание преимущественно от аккумулятора с периодическими подпитками от солнца.
Батарея телефона вывозит такой режим достаточно хорошо. Спустя год с лишним постоянной работы, она сохранила 76% изначальной ёмкости. Во многом это заслуга системы управления батареями в зарядной станции.

И вот одно неожиданное открытие: в слегка нагретом состоянии (но не горячем) телефон быстрее выполняет распознавание текста. То есть в прохладные утренние часы скорость обработки падает, чего я бы никогда не заметил при питании от сети.
Изначальные вложения:
EcoFlow River 2 Pro: $599 CAD (покупалась для туризма).
Солнечная панель на 220 Вт: $180 CAD.
Кабели, монтажное оборудование: ~$50 CAD.
Дополнительные вложения в конфигурацию солнечной батареи: ~$230 CAD
Ежемесячная экономия: исходя из фактических данных EcoFlow, которые показывают потребление в диапазоне 37,4 — 45,8 кВт/ч, я экономлю примерно $84-120 CAD в год. Итого период окупаемости около 2-3 лет.
Облачные сервисы распознавания текста обычно берут по $1.00-1.50 за 1 000 запросов. То есть обработка 83 000 обращений обошлась бы мне в $83-125 CAD, плюс это всё же отправка изображений на сторонние серверы, так что тут ещё возникает угроза конфиденциальности.
Мой же сетап с солнечной панелью не требует оплаты запросов и при этом полностью конфиденциален.
Используемое оборудование крайне надёжно. Телефон больше года проработал без остановки и держится бодрячком. Несмотря на постоянную нагрузку, ощутимого падения производительности не наблюдается.
Фоновая обработка в iOS работает лучше, чем я ожидал — нужно лишь найти подход. Суть в правильном использовании фонового обновления приложений и отправке регулярных запросов для поддержания активности сервера.
Фреймворк Vision постепенно дорабатывают. Те операции распознавания текста, которые раньше проваливались, теперь выполняются успешно, в частности, это касается рукописных текстов и необычных шрифтов.
Перебои с солнечной энергией: я настроил зарядную станцию так, чтобы она отдавала приоритет телефону (меньший потребитель энергии) и мягко отключала Мини-ПК, когда заряд батареи на исходе. В случае чего телефон также может без подпитки обрабатывать простые OCR-запросы в течение нескольких часов.
Компенсация нагрева: прямой солнечный свет вкупе с постоянной нагрузкой ведут к троттлингу. Я добавил тень, улучшил обдув и реализовал механизм смарт-обработки, который сокращает число запросов, когда телефон сообщает о перегреве.
Ограничения фоновой обработки iOS: iOS следит за тем, чтобы приложения не работали бесконечно. Я использую фоновое обновление приложений, минимальный сервис определения местоположения и поддерживаю активность HTTP-сервера запросами. Приходится обеспечивать тонкий баланс между поддержанием работы всего сетапа и экономией батареи.
Помимо очевидной крутизны, мой проект демонстрирует несколько важных принципов:
Акцент на конфиденциальности. Все изображения остаются у меня на устройствах. Никакой выгрузки в облако, никакого стороннего доступа. В эпоху, когда уже всё отправляется куда-то на чужой компьютер, истинная локальная обработка выглядит революционной.
Энергонезависимость. Несмотря на то, что экономия не радикальная, важен сам принцип. Мой пример подтверждает, что вполне весомые вычислительные нагрузки можно выполнять полностью за счёт возобновляемой энергии, даже в зонах с суровым климатом.
Сокращение электронных отходов. Этому телефону был уготован долгий ящик. Теперь же он служит продуктивным элементом в моей экосистеме устройств. Сколько старых девайсов можно было бы пустить в полезное дело вместо того, чтобы плодить электронные отходы?
Локальные вычисления. Не всё должно происходить в облаке. Порой наилучшее решение находится прямо перед тобой, питается от Солнца и обрабатывает данные локально, сохраняя полную конфиденциальность.
Теперь эта конфигурация служит наглядной демонстрацией для тех гостей, которым интересны возобновляемые источники энергии и локальные вычисления. Да и в целом мне реально нравится, что я могу мониторить статистику работы сервера прямо на окне, параллельно любуясь птицами, которые прилетают ко мне на кормушки.
Дам ориентиры на случай, если вам вдруг захочется собрать нечто подобное.
EcoFlow River 2 Pro [3] — зарядная станция, которую использую я.
Renogy 100W Solar Panel [4] — аналог моей конфигурации.
Любой iPhone 8 или новее с iOS 13+, чтобы поддерживал фреймворк Vision.
Apple Vision Framework Documentation [5] — официальная документация по реализации OCR.
Background App Refresh Guide [6] — инструкция о том, как поддерживать активными приложения iOS.
SwiftUI HTTP Server Examples [7] — реализация HTTP-сервера.
TP-Link Kasa Smart Plugs [8] — для отслеживания фактического потребления энергии.
EcoFlow app — встроенный инструмент мониторинга для River 2 Pro.
GearScouts.com [2] — сравнение цен на зарядные станции и уличное оборудование.
Автор: Bright_Translate
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/431952
Ссылки в тексте:
[1] GearScouts: https://gearscouts.com/power-stations
[2] GearScouts.com: http://GearScouts.com
[3] EcoFlow River 2 Pro: https://us.ecoflow.com/products/river-2-pro-portable-power-station
[4] Renogy 100W Solar Panel: https://www.renogy.com/100-watt-12-volt-monocrystalline-solar-panel/
[5] Apple Vision Framework Documentation: https://developer.apple.com/documentation/vision
[6] Background App Refresh Guide: https://developer.apple.com/documentation/backgroundtasks
[7] SwiftUI HTTP Server Examples: https://github.com/Building42/Telegraph
[8] TP-Link Kasa Smart Plugs: https://www.kasasmart.com/
[9] Источник: https://habr.com/ru/companies/ruvds/articles/950814/?utm_campaign=950814&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.