В 2017 году появилась компания NYCTrainSign, которая изготавливала реплики таймеров обратного отсчёта, показывающие, сколько осталось до прибытия следующего поезда Нью-Йоркского метро.


Однако этот таймер не вешался на потолок, а ставился на стол в качестве стильного украшения дома.

Человек, отвечавший за маркетинг, успешно смог привлечь интерес к проекту. Помню множество постов в Facebook* и Instagram*, демонстрирующих потенциальную пользу вывески для кафе и пиццерий, посетители которых могли видеть, когда им нужно выходить, чтобы попасть на поезд.

Однако под флёром Instagram* скрывались посредственные технические решения и недопустимо высокие затраты на производство. [* Запрещены в России.]

В начале 2018 года компания перестала отвечать под постами в соцсетях, а приобретённые таблички получили очень немногие покупатели. Компания порекомендовала покупателям оспорить платёж, чтобы попробовать вернуть свои деньги.

Сегодня даже новые компании, входящие на этот рынок, вынуждены учитывать последствия провала NYCTrainSign.

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

Покупаем табличку


Примерно в 2021 году я увидел, что на Reddit кто-то продаёт NYCTrainSign. Это был один из тех немногих людей, кто получил товар от компании, и стремился избавиться от него.


Как ни удивительно, первоначальный владелец сохранил даже упаковку.


Коробка


Сама табличка


Включённая табличка

Разборка


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


Задняя панель таблички. Непонятно, что чего нужно отверстие.

Для меня, не имеющего практически никакого плотницкого опыта, корпус выглядит довольно неплохо. У него есть несколько плохих углов, но он вполне неплохо смотрелся бы в моём доме.

Внутри табличка состояла из следующих компонентов

  • Две панели из матрицы светодиодов
  • Одна плата Raspberry Pi 3
  • Одна карта MicroSD на 4 ГБ
  • Один HAT матрицы светодиодов Adafruit
  • Провода для подключения к источнику питания
  • Провода для панелей матриц
  • Небольшая кнопка, подключенная к GPIO на Pi


Внутренности таблички. Обратите внимание на валяющийся кусок изоленты и отключённый кабель питания.

С корпусом всё неплохо, но, взглянув внутрь, сразу можно понять, что табличка сделана не очень качественно.

Pi наполовину закручена на два болтающихся винта. Кнопка (предназначенная для сброса) просто валяется. По какой-то непонятной причине в задней панели есть огромное отверстие. Похоже, что провода питания могут сломаться от слишком сильного движения, и после прибытия моей покупки действительно оказалось, что провода отсоединились.

Слишком высокая стоимость материалов


BOM (bill of materials) — это список компонентов, используемых для создания продукта. У большинства проектов, связанных с электроникой, особенно у серьёзных, существует подробный BOM, в котором есть комплектующие и цена, за которую их продают.

Часто окончательные затраты на BOM оказываются гораздо ниже, чем розничная цена из-за стоимости доставки, исследований и разработок, необходимой прибыли и так далее. Небольшие изменения в стоимости BOM могут существенно влиять на окончательную стоимость устройства. Часто производители меняют поставщиков или детали, чтобы сэкономить на BOM несколько центов.

Чтобы получить розничную цену, я обычно умножаю стоимость BOM в четыре раза.

Получив доступ к табличке, мы можем прикинуть гипотетические затраты на BOM:

  • Raspberry Pi 3 — $35
  • Adafruit LED Matrix HAT — $25
  • Матрица светодиодов * 2 — $60 (минимум $30 каждая)
  • Блок питания 5 В, 2А — $5 (наиболее вероятно)
    • Подозрительно, что такой силы тока недостаточно для питания всех комплектующих в полную силу. В большинстве руководств рекомендуется от 4 до 10 А.
  • Карта MicroSD на 4 ГБ — $7 (наиболее вероятно)
  • Деревянный корпус — $15 (наиболее вероятно)
  • Прочие детали
    • Провода, кнопки, кабели, винты, упаковка (табличка продавалась в картонной коробке с листом бумаги, в пузырчатой плёнке и пенопласте) — $3 (наиболее вероятно)

То есть приблизительные затраты на BOM составили $150. Если прикинуть по моей методике, то рекомендуемая розничная цена должна быть не меньше $600.

Владельцы компании не знали этого трюка


Судя по архивам веб-страниц команда NYCTrainSign продавала таблички по $600 но были и статьи, где упоминались цены примерно $300. Кто-то говорил, что покупал таблички примерно за $200 и даже всего за $100.

Учитывая стоимость BOM, $299 — это практически грабёж

Похоже, у компании были планы и сдавать таблички в аренду по $30 в месяц.

Очевидно, что исходя из BOM, $300 — это слишком низкая цена, но $600 — это, наверно, уже перебор. В конце концов, это просто табличка.

Аренда — это интересная идея, но мне кажется, что было бы очень сложно возместить изначальные вложения средств. «Железячным» бизнесам часто нужна первоначальная инъекция средств для приобретения товарно-материальных активов, после чего им необходимо как можно быстрее возместить эти средства и получить прибыль, продавая товар.

Кто продавал лопаты


Есть такая поговорка: «Во время золотой лихорадки продавай лопаты».

В нашей истории лопаты продавала Adafruit. Из-за использования Adafruit LED Matrix HAT затраты на BOM подскочили на $25 или примерно на 20%. Без HAT вполне можно было бы обойтись благодаря простым инженерным решениям.


Та самая лопата

Причины:

  1. Без HAT можно обойтись. В библиотеке rpi-rgb-led-matrix, которую использовали в табличке, есть инструкции по прямому подключению и архитектуры для пассивной адаптерной платы. Эти инструкции и платы в 2017 году уже были в библиотеке.
  2. В 2017 существовал и более дешёвый HAT. При цене $2,10 он был бы гораздо дешевле Adafruit HAT за $25. Кроме того, несмотря на использование более дорогого Adafruit HAT, табличка по какой-то причине постоянно мерцает.
  3. Чаще всего детали Adafruit используются для прототипирования, а при переходе к производству заменяются на что-то более дешёвое. Вероятно, это отразилось и на схеме ценообразования Adafruit.

Возможно, вы подумаете, что Raspberry Pi Foundation тоже оказался продавцом лопат. Цена $35 слишком велика, это самый дорогой пункт BOM.

Эта плата может показаться излишне мощной, и я не рекомендую её использовать, однако поразмыслив, можно прийти к выводу, что выбор Pi был не таким уж плохим решением по сравнению с использованием Arduino или ESP32. Он обеспечил компании бесплатный маркетинг и дал простую среду разработки.

На мой взгляд, если команда NYCTrainSign не хотела вкладывать время в разработку на основе микроконтроллера наподобие ESP32, то было бы логично начать с Raspberry Pi 3, а затем перейти на Pi Zero W после её выпуска.

В конечном итоге им бы нужно было нацеливаться на ESP32 или что-то подобное, и ещё больше снижать затраты на BOM, но мне не кажется, что начав с Pi, они так уж ошиблись, если в долговременной перспективе эту плату хотели заменить чем-то другим.

Читаем код


Так как устройство создано на базе Raspberry Pi, можно легко создать резервную копию копию MicroSD, чтобы изучить файловую систему и внести нужные изменения.

Кодовая база таблички состоит из самописного кода на Python и NodeJS плюс из множества опенсорсных частей.

На Pi выполняется два основных самописных компонента:

  • Python-сервер (LED Server)
  • NodeJS-сервер (Config Server)

LED Server


Написанный на Python LED Server отвечает за отрисовку на матрице светодиодов и за получение данных о поездах от API компании. LED Server общается с Config Server, чтобы определить, какие параметры сконфигурировал пользователь, а затем отправляет частые HTTP-вызовы удалённому серверу, чтобы получить данные (например, время прибытия поездов и погоду).

Получив данные о поездах, LED Server локально генерирует изображение или текст, а затем рендерит их на матрице светодиодов.

Config Server


Написанный на NodeJS Config Server отвечает за хранение пользовательской конфигурации в файле JSON и получение запросов на передачу и обновление этого файла. Во время запуска Config Server получает самую новую конфигурацию с HTTP-сервера. Кроме того, Config Server подключается к конечной точке AWS IoT Core для получения обновлений конфигурации в реальном времени от MQTT-сервера.

Другие компоненты


  • При первом запуске выполняется raspberry-wifi-conf (опенсорсное приложение, заставляющее Pi создать беспроводную сеть, к которой должен подключаться пользователь; также оно передаёт ему сведения о подключении WiFi).
  • Кнопка сброса Reset управляется небольшим скриптом на Python, работающим в фоновом режиме. При нажатии на кнопку скрипт удаляет параметры Wifi, сбрасывает имя хоста, удаляет функциональность удалённого мониторинга и перезагружает сервер.
  • Похоже, компания могла удалённо подключаться к терминалу каждой таблички. Оказалось, что в моей табличке установлено ПО для удалённого контроля, созданное https://www.dataplicity.com/.

Качество кода


Изучая код, я заметил различные проблемы с качеством:

  • Похоже, API перевозок не способен учитывать, что на станции может быть несколько линий поездов. Две линии на одной станции отображаются как заканчивающиеся на одной остановке.
  • Отсутствует чётко выраженный процесс обновления прошивки. Возможно, для обновления пользователям нужно было просто прошивать карту MicroSD новым образом Pi.
  • Большая часть кода на Python просто использует системные вызовы, чтобы вносить изменения при помощи системы
  • Написанный на Python LED Server для сохрания/получения конфигурации обменивается данными с написанным на NodeJS Config Server. Подозреваю, что так было сделано, потому что команде было проще взаимодействовать с AWS IoT через NodeJS, а с дисплеем было проще взаимодействовать через Python.
  • Часто попеременно используются табы и пробелы из-за неправильно настроенных редакторов кода
  • На карту MicroSD сохранена вся git history
  • На карту MicroSD сохранена Bash history
  • Код очень редко используется многократно

Возрождение таблички


Получаем шелл


На большинстве Raspberry Pi получить рутовый шелл относительно просто, потому что на карте MicroSD отсутствует шифрование. Мы просто можем запуститься в однопользовательском режиме и сбросить пароль для пользователя pi.

Однако несмотря на то, что теперь у нас есть шелл и можно приступать к экспериментам, всё это неважно, потому что API компании больше не существует. Табличка запрограммирована в случае отсутствия доступа к Интернету показывать прописанные в коде локальные данные, поэтому все отображаемые данные бесполезны.

Воссоздаём сервер


Разумеется, мы можем изменить домен, с которым общается табличка, но, к счастью, домен, с которым она коммуницирует по умолчанию, можно было купить.

Итак, я его купил.


Кто знал, что взлом окажется таким простым

Имея полный контроль над доменом, мы можем создать новый API, которого ждёт табличка, и вернуть к жизни все таблички, которые всё ещё используются. Потенциально мы даже можем выполнить некий апдейт, чтобы обновить в табличках ПО.

Я воссоздал конечные точки для времени прибытия поездов (по крайней мере, для Нью-Йорка) и данных о погоде. Для получения времени прибытия поездов я решил использовать API сайта https://wheresthefuckingtrain.com/. Для данных о погоде я использовал OpenMeteo API.

Получаем контроль над табличкой


Как и большинство IoT-устройств, табличка выполняет множество системных вызовов. Один вызов напрямую конкатенирует ID таблички в команду шелла. Имея контроль над сервером, мы теоретически можем напрямую получить удалённый контроль над любой табличкой.


IoT во всём своём великолепии

Так как мы контролируем домен, то теоретически можем передать любой табличке злонамеренный ID таблички и выполнить произвольную команду. Затем можно использовать её для регистрации таблички на новом сервере управления и снова вернуть людям контроль над их табличками.

Если не брать в расчёт разные скучные подробности обработки данных, наш эксплойт выглядит так:

  1. Табличка включается и пытается получить конфигурацию. Это действие происходит в бесконечном цикле, пока табличка что-нибудь не получит.
  2. Далее табличка отправляет запрос логотипа. Запрос содержит два ID, уникальных для каждой таблички. Мы сохраняем эти ID и создаём конфигурацию эксплойта таблички.
  3. При следующем запросе конфигурации таблички мы передаём табличке наш эксплойт.
  4. Мы просим пользователя перезагрузить табличку, и после перезапуска запускается наш эксплойт
  5. Эксплойт обновляет весь код, который необходим для его сопряжения с нашим новым сервером

Вот видео с запущенным эксплойтом


Получив возможность удалённой передачи произвольных данных табличек, мы можем официально заявить, что восстановление таблички завершено!

Обладая полным контролем над доменом, мы стали новыми капитанами NYCTrainSign.


Что же случилось с компанией?


Слишком много скидок


Думаю, основная проблема — слишком высокие затраты на BOM, а также продажа множества табличек со скидкой.


В данном контексте $117 — это практически бесплатно

Я не думаю, что даже во время беты можно производить продукт за $150, а продавать за $117, не имея поддержки венчурного капитала.

Как говорилось выше, даже при цене $300 продукт слишком дёшев. Скорее всего, табличка с самого начала должна была продаваться за $600.

Звучали идеи о демонстрации рекламы, но производитель светодиодных табличек — это не тот тип компании, который быстро растёт. Поэтому продажа множества табличек в убыток на самом деле работала только на маркетинг.

Переизбыток рекламы


У компании NYCTrainSign какое-то время имелся главный директор по маркетингу, менеджер по соцсетям (SMM) и ассистент по соцсетям.




Резюме трёх бывших сотрудников компании на LinkedIn

Для только что зарождающегося стартапа это кажется перебором.

В то время у MTA (компании, занимающейся перевозками в Нью-Йоркском метрополитене) часто случались задержки поездов, активно освещавшиеся в медиа. Похоже, NYCTrainSign быстро и бесплатно привлекла к себе большой интерес. Вероятно, было бы достаточно и бесплатного маркетинга.

Учитывая дополнительную рекламу и маркетинг, которые компания приобретала, на её продукт был большой спрос.

Нехватка продукта


Однако несмотря на спрос, команда не могла обеспечить выпуск в нужных объёмах. Не говоря уже о том, что каждую табличку вручную собирали в Бруклине, а это при низкой розничной цене было очевидно невыгодным. Кроме того, маловероятно, что у компании было на руках достаточно комплектующих, поэтому ей приходилось ждать поставок.

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

На этом этапе компания сообщила своим покупателям, что ожидается полугодовая задержка, пока она переносит производство в Китай. Покупатели, не желавшие ждать, могли связаться с компаниями, обслуживающими их кредитные карты, и подать заявление на возврат средств.

Похоже, переезд производства в Китай был беспочвенной мечтой, которая так и не начала исполняться. Вскоре после этого заявления компания прекратила работу, а её офис закрылся.

Слишком много поваров


Судя по информации на Linkedin, изначально у компании было четыре основателя. Со временем она разрослась до 11 человек, а в какой-то момент суммарно в работе компании принимало участие 15 человек.


Если даже каждому основателю досталось бы всего 60 тысяч долларов, то учитывая прибыль на каждую табличку примерно в $400, нужно было бы продавать в год около 600 табличек по полной цене, чтобы заработать достаточную выручку для выплаты зарплат.

Один из основателей как-то опубликовал скриншот их продаж: примерно за два месяца компания достигла выручки в 250 тысяч долларов.


Выручка — это, скорее, показатель популярности, а не предпринимательского успеха

Однако непонятно, какую часть этой суммы составляла прибыль, ведь многие таблички продавались по огромной скидке. Стоимость $600 кажется чрезмерной. Гораздо разумнее выглядит цена в $200 или $300.

Мне кажется, что в городе с населением примерно 8,5 миллиона было бы не особо сложно продавать 600 табличек хотя бы в первый год. Но в следующий год вам пришлось бы снова продавать примерно 600 табличек. И это не включая затраты на всех других сотрудников, подрядчиков и так далее.

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

Хорошая идея, подходящий момент, плохая команда, плохой продукт


После смерти компании её основатели и сотрудники по какой-то причине попытались создать некую консалтинговую фирму.


Интервью с основателями о том, как им не удаётся справиться с выполнением заказов

Основатели компании так и не рассказали, что же произошло на самом деле, почему было выпущено так мало устройств и куда подевались деньги. Как минимум один основатель сказал, что лично он не получил никаких денег, но они должны были куда-то деваться.


Скорее всего, это правда, но деньги должны были куда-то деваться

Это отсутствие прозрачности превратило любимую когда-то публикой компанию во что-то типа мема.

Сегодня компания полностью развалилась, и трое из четырёх основателей публично заявили, что занялись другими делами. Многие из бывших сотрудников по-прежнему указывают компанию в своём резюме на LinkedIn. Один основатель (CEO) пропал с радаров, и его не найти в Интернете.

В конечном итоге, у команды не было чёткого плана, что делать с её продуктом; похоже, люди взялись за создание компании, не продумав тщательно, как будут действовать на каждом из этапов. Возможно, такое можно сделать в программной компании, но не в сфере оборудования.

Меня крайне расстраивает то, что я искренне верю: если бы команда NYCTrainSign пообщалась с кем-нибудь, имеющим познания в электронике, то она была бы гораздо успешнее. Однако, похоже, что главным консультантом основателей компании был их профессор computer science из колледжа.

Кажется, NYCTrainSign просто взяла проект, который в свободное время разрабатывал её CEO, и попыталась продавать его за $300-$600, не сделав из него готовый продукт и не продумав то, что может произойти потом.


Итог: хорошая идея, хорошо выбран момент, плохая команда, плохой продукт.

Основатели и сотрудники кажутся мне достаточно честными людьми. Не думаю, что у них были какие-то коварные намерения.

Это просто несколько друзей, у которых не оказалось достаточно опыта для создания «железячного» бизнеса; внезапный успех маркетинга застал их врасплох.

Однако CEO Тимоти Ву должен был честно рассказать, что произошло со всеми средствами покупателей и что пошло не так.

Я не уверен, что есть какие-то юридические требования по возврату средств, однако мне кажется, у них есть моральные обязательства быть справедливыми с покупателями. Особенно если в конечном итоге им не отдали их покупку. Я считаю, что, по крайней мере, команда должна была объясниться.

Что происходит сегодня


Когда я приступил к этому исследованию, у меня была мечта создать собственную табличку и продавать её как продукт.

Я изготовил прототип очень полезной таблички на основе ESP32, которым пользуюсь по сей день.


Буквы G и R в правом верхнем углу обозначают дни уборки мусора и перерабатываемых отходов. На самом деле, это самая полезная функция таблички.

Однако чем больше я думал об этом, тем сильнее ощущал, что не подхожу для вывода этого продукта на рынок. Мои сильные стороны — это ПО и, возможно, бизнес, но не электротехника или плотницкое дело.

Не говоря уже о том, что рынок светодиодных табличек переполнен и на нём множество готовых решений. Светодиодных вывесок много не только на Amazon, есть и более сложные таблички, например, Tidbyt или эта, найденная мной на Etsy.


Я решил, что вместо того, чтобы заходить на переполненный рынок, лучше продолжу работать над своей табличкой на ESP32 в качестве личного проекта для самообразования.


Для сообщества я выложу в опенсорс исходный код таблички NYCTrainSign, а также воссозданный сервер API с кодом эксплойта.

Также я буду поддерживать новый сервер NYCTrainSign, пока затраты на хостинг относительно малы. У меня нет намерений добавлять новые функции в NYCTrainSign, однако есть идеи по улучшению прошивки таблички.

Поэтому если у вас есть табличка NYCTrainSign, попробуйте сайт, который я создал для удалённого управления табличками.

Если инструкции не помогли, отправьте отчёт. Ну а если у вас нет NYCTrainSign, то её точно не стоит покупать.

Комментарии (10)


  1. YDR
    00.00.0000 00:00
    +2

    они всего лишь "не шмогли" (или решили не делать) адаптацию к массовому производству.


    1. akakoychenko
      00.00.0000 00:00
      +3

      Такое впечатление, что проблема стартапа в том, что он перерос подработку, которой можно заниматься по выходным (и тогда собирать за $150 и продавать по $600 не так уж и плохо, - всяко выгоднее и приятнее, чем бомбить на убере). Но не дорос до бизнеса, - слишком уж узкая ниша (если б там был реально взрывной потенциал, то бренд млн бы купить стратег, для которого не проблема найти и топового электронщика, который пересоберет на дешёвых деталях все, и производство в Китае организовать, - лишь бы знать, что поток заказов не скукожиться).


  1. Javian
    00.00.0000 00:00
    +1

    Я изготовил прототип очень полезной таблички на основе ESP32

    off Использование светодиодной матрицы только для отображения символов выглядит несколько расточительно. Большая часть светодиодов никогда не засветятся.


  1. HEXFFFFFFFF
    00.00.0000 00:00
    +7

    Как электронщик скажу что устройство простейшее. Себестоимость можно опустить в разы. Мне кажется тут распбери и все обвязку с успехом заменит esp32 за 2$. А полную себестоимость можно уложить в пару десятков $. Другое дело что создать такое устройство совсем не сложно, а вот продать такую штуку хоть кому то, хоть за пару баксов очень проблематично. Удивлен что данный проект собрал хоть что то. Так же, в связи с этим, могу предположить куда делись деньги. Не удивлюсь если хоть что то им удалось собрать только потому что в рекламу было вложено денег больше чем было собрано, все полученные деньги просто уходили в рекламу.

    PS. Сам пытался запустить пару подобных стартапов- один медицинских прибор и вечные светодиодные лампочки. Ни под то не под другое и пары баксов собрать не удалось, а мне кажется что мои проекты были гораздо менее идиотские и сильно более полезные для потребителя чем эти дурацкие таблички.


    1. Iv38
      00.00.0000 00:00

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


      1. Javian
        00.00.0000 00:00

        Это можно было перенести в приложение для телефона.


        1. Iv38
          00.00.0000 00:00
          +3

          Наверняка такое приложение уже даже было в 2017. Было же апи, откуда они брали эти данные. Но, блин, табло кажется реально удобным. Сидишь в баре и поглядываешь периодически. И это не зависит от модели твоего телефона и знания о существовании такого приложения. В аэропорту тоже можно смотреть табло онлайн, но там при этом повсюду электронные табло стоят.


          1. Mekeke
            00.00.0000 00:00

            На самом деле идея реально прикольная для заведений в странах с хорошим общественным транспортом. В той же Японии, к примеру. Особенно мне кажется зашло бы не в Токио, а в японской провинции, где электричка раз в полчаса и профукать нужную может быть чревато.


  1. Fox_exe
    00.00.0000 00:00
    +5

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

    Hidden text


    1. Fox_exe
      00.00.0000 00:00
      +6

      Что интересно - для отображения 8 цветов было достаточно Atmega328p. Её даже хватало на диммирование в 256 цветов.

      Отдельным гемороем было написание библиотеки для работы с этими панелями - в интернете ничего готового не было. Благо панельки делались на базе сдвиговых регистров (по 16 выводов) с одной переключающей микрухой (сигналы RGB подавались по 3м отдельным пинам, но отображались раздельно, последовательно).

      В коде получилось аж 5 уровней вложенности циклов "For" - настолько там была корявая адресация пикселей. Как я это оптимизировал - тема для целой статьи... Может, когда-нибудь и напишу её...

      На ESP32 или STM32, где есть DMA, можно уже выдать 65536 цветов, чего будет вполне достаточно для отображения красивой анимации. Да и панелек можно подключить значительно больше.