Reprendre une entreprise IoT morte
(blog.kchung.co)Cinq ans après la fermeture de NYCTrainSign
- Un panneau LED personnel indiquant les heures d’arrivée du métro de New York (basé sur Raspberry Pi)
- Enquêter sur les raisons de l’échec de l’entreprise et écrire un exploit pour reprendre leur flotte
- À l’époque, c’était extrêmement populaire sur Instagram/Facebook, mais beaucoup de gens n’ont jamais reçu leur produit
- En en récupérant un via un vendeur d’occasion et en le démontant, il s’est avéré que l’intérieur était de piètre qualité et que le modèle économique n’était pas viable
- Le BOM (Bill of Materials) était beaucoup trop élevé (autrement dit, le coût de fabrication lui-même était trop important)
- En général, j’estime le prix de vente au détail en multipliant le coût du BOM par environ 4
Prix des composants
- Raspberry Pi 3 - $35
- Adafruit LED Matrix Hat - $25
- LED Matrix * 2 - $60
- Alimentation 5V 2A - $5
- Carte MicroSD 4GB - $7
- Boîtier en bois - $15
- Divers fils, boutons, vis, packaging, etc. - $3
- Rien qu’avec ce calcul, on arrive déjà à $150, donc il aurait fallu le vendre $600
Ils ne connaissaient pas l’astuce
- En regardant leur site sur le web archive, il semble qu’ils aient essayé de le vendre $599
- Mais au début, ils l’ont aussi vendu à $299, voire $100 (version bêta)
- Ils ont aussi apparemment tenté de le louer à $30/mois (ce qui aurait aussi été difficile, le hardware nécessitant un coût initial)
Qui vendait les pioches
- « Pendant la ruée vers l’or, vendez des pioches » : ici, qui a gagné de l’argent en vendant les pioches ? Adafruit
- L’utilisation de l’"Adafruit LED Matrix HAT" augmentait le prix de $25 (environ 20%)
- C’est quelque chose qu’on aurait pu économiser avec un peu d’effort d’ingénierie, puisque ce n’était pas indispensable
- Un câblage direct aurait été possible. Ou alors utiliser des HAT bon marché à $2
- La plupart des produits Adafruit ne servent qu’au prototypage initial, puis sont remplacés en production par des alternatives moins chères
- On peut aussi considérer Raspberry Pi comme un vendeur de pioches, mais utiliser Arduino ou ESP32 aurait sans doute été excessif
- À mon avis, il aurait fallu commencer avec un Pi 3, puis passer à un Pi Zero W
Lecture du code
- J’ai examiné le code Python & NodeJS présent sur la MicroSD
- Il y a 2 composants principaux : un serveur Python (serveur LED) et un serveur NodeJS (serveur de configuration)
Serveur LED
- Il s’occupe de l’affichage sur la matrice LED et de récupérer les informations sur les trains via l’API de l’entreprise
- Il communique avec le serveur de configuration pour récupérer les préférences utilisateur
- Il récupère les données des trains, génère des images/du texte, puis les rend sur la matrice LED
Serveur de configuration
- Il stocke les informations utilisateur en JSON et met à jour le fichier correspondant lorsqu’il reçoit une requête de mise à jour
- Au démarrage, le serveur de configuration récupère les informations les plus récentes
- Il se connecte à AWS IoT Core et reçoit en temps réel les changements de configuration depuis le serveur MQTT
Qualité du code
- Il y a de nombreux problèmes de qualité dans le code
- L’API Transit ne prend pas en compte le fait qu’une station puisse avoir plusieurs lignes de train
- Il n’y a pas de processus de mise à jour du firmware
- Beaucoup de code Python modifie simplement le système via des appels système
- Le serveur LED en Python récupère ses informations en parlant au serveur de configuration NodeJS ; j’imagine que c’est parce qu’AWS IoT Core était plus facile à coder en NodeJS, tandis que Python était plus pratique pour gérer l’affichage
- Il y a un mélange de tabs et d’espaces (sans doute à cause d’une mauvaise configuration de l’éditeur)
- Tout l’historique git est stocké sur la microSD
- L’historique bash y est aussi stocké
- Il n’y a pratiquement aucune réutilisation de code
Résurrection du panneau
Obtenir un shell
- Comme la plupart des Raspberry Pi n’ont pas de MicroSD chiffrée, il est facile d’obtenir un shell root
- Il suffit de démarrer en mode single-user et de réinitialiser le mot de passe de l’utilisateur pi
- L’API de l’entreprise n’existe déjà plus, et l’appareil est conçu pour utiliser des données locales codées en dur quand il n’a pas de connexion Internet
Recréer le serveur
- Achat du domaine trainsignapi.com pour l’API
- Il est désormais possible de contrôler complètement le domaine
- Pour les informations sur les trains : https://wheresthefuckingtrain.com/ , pour la météo : https://open-meteo.com/
Prendre le contrôle du panneau
- Comme beaucoup d’autres appareils IoT, le panneau utilise de nombreux appels système
- L’un de ces appels concatène directement l’ID du panneau dans une commande shell
- Comme je contrôlais directement le serveur API, je pouvais prendre le contrôle à distance de tous les panneaux
- Après plusieurs essais, j’ai écrit un exploit
- Quand le panneau démarre, il récupère ses informations de configuration et envoie une requête pour le logo image
- À ce moment-là, l’ID du panneau est transmis
- Je stocke cet ID, puis lors de la requête suivante pour le logo image, j’envoie l’exploit au panneau
- Si l’utilisateur redémarre le panneau, l’exploit s’exécute au redémarrage
- L’exploit met à jour le code nécessaire et force l’appairage avec notre serveur
- Désormais, ces appareils fonctionnent correctement avec le nouveau serveur API
Que s’est-il passé ?
- Le problème, c’était les ventes à trop forte remise
- Impossible de fabriquer à $150 et de vendre à $117
- Même $300, c’était trop bas. Il aurait fallu demander $600 dès le départ
- Pour une startup, ils avaient trop de personnel marketing et des coûts publicitaires trop élevés
- Ils n’ont pas non plus réussi à fabriquer suffisamment de produits par rapport à la demande (production manuelle)
- Malgré cela, ils continuaient à prendre des commandes, au point que cela ressemblait à un schéma de Ponzi où l’argent des nouvelles commandes servait à fabriquer les unités précédemment vendues à prix cassé
- Ils n’ont pas non plus réussi à délocaliser la production en Chine
- D’après LinkedIn, il y avait 4 fondateurs, puis l’effectif est monté à 11, et jusqu’à 15 personnes à un moment donné
- Même en comptant seulement $60k par fondateur, il aurait fallu vendre au moins 600 appareils dégageant $400 de marge
- D’après une capture d’écran partagée par un fondateur, ils auraient fait $250k de chiffre d’affaires en deux mois
- Mais comme les remises sur les appareils étaient trop importantes, on ne sait pas quel bénéfice ils ont réellement dégagé
- Les fondateurs n’ont jamais clairement expliqué ce qui s’était passé, pourquoi si peu de produits avaient été expédiés, ni où tout l’argent était parti
- L’un des fondateurs a affirmé n’avoir personnellement rien touché du tout
- Je pense que NYCTrainSign aurait pu réussir s’ils avaient au moins parlé avec quelqu’un ayant des compétences en électronique
- Au lieu de cela, leur principal conseiller était un professeur d’informatique à l’université
- NYCTrainSign, c’était le projet que le CEO avait bricolé sur son temps libre, puis qu’il a essayé de vendre $300~$600 sans réfléchir à ce qui allait suivre
- En résumé : "Good Idea, Good Timing, Bad Team, Bad Product"
What Happens Now
- Quand j’ai commencé tout ça, je rêvais au départ de vendre mon propre panneau
- J’en ai fabriqué un avec un ESP32, et je l’utilise encore aujourd’hui
- Mais plus j’y réfléchis, moins je pense être la bonne personne pour le fabriquer et le vendre
- Le marché des panneaux LED est déjà très concurrentiel : il y a Tidbyt et d’innombrables sociétés sur Amazon
- J’ai donc décidé d’en rester à un projet d’apprentissage personnel
- Tout ce qui concerne NYCTrainSign a été publié en open source
- Y compris le serveur API avec le code de l’exploit
- Je compte aussi continuer à héberger le nouveau serveur NYCTrainSign (les coûts d’hébergement sont très faibles)
- Je ne prévois pas d’y ajouter de nouvelles fonctionnalités, mais j’ai des idées pour un firmware amélioré
- Si vous avez un panneau, j’ai mis en place un site pour le gérer à distance, donc n’hésitez pas à l’utiliser
- « Si vous n’avez pas de panneau, n’en achetez pas un maintenant »
2 commentaires
C’est intéressant haha
Mais si jamais ils jugent que c’est rentable et décident d’en faire une activité commerciale, est-ce que ça ne risquerait pas de poser des problèmes juridiques ?
On a dirait un jeu de gestion façon tycoon.
Code Quality > je pense qu’il y a une coquille, et que plusieurs problèmes de qualité du code sont indiqués comme « aucun ».