
Llevaba tiempo queriendo un panel econoico para Home Assistant en las habitaciones, sin tener que recurrir a una tablet "convencional" que a veces son dificiles de integrar por diseño con las estancias, justo Meta acaba de liberar el acceso ADB en sus Portal descatalogados. Un dispositivo con pantalla de 8", audio, camara, microfono y precio muy economico el mercado de segunda mano. Asi que conseguí un Facebook Portal Mini (modelo DT90GB) por 20euros y me puse a ello.
Un apunte por si quieres hacerte con uno: en España el Portal no tuvo mucho exito y cuesta encontrarlos y los pocos que salen son con precios bastante altos, pero en Francia si fueron populares. En plataformas francesas como Vinted aparecen constantemente por unos 20-35 euros.
Aviso antes de nada: el proceso tiene dos "trampas" que, si te tocan, te cuestan un factory reset. A mi me costaron dos. Estan al final del articulo; leelas antes de empezar a desactivar cosas.
Que hay dentro
Conviene saber con que jugamos antes de tocar nada. El Mini no es un IoT cualquiera:
- SoC: Qualcomm QCS605 octa-core, arm64
- OS: Portal OS, un fork bastante tuneado de Android 10 (API 29), sin servicios de Google
- Pantalla: 8" IPS tactil
- Alimentacion: jack de barril de 19V/2.37A (no es USB-C, atento a esto)
Lo importante: la base es AOSP sin GMS. Eso significa que podemos sidecargar APKs sin problema, pero cualquier app que dependa de Google Play Services (push por FCM, ubicacion, Matter) va a ir capada o directamente a petar. Lo tendremos en cuenta al elegir la version de HA.
Lo que necesitamos
- Un Portal Mini con el toggle de ADB disponible en ajustes. El rollout de Meta ha sido irregular, asi que verifica que tu unidad lo trae antes de comprar nada.
- Un cable USB-C de datos (de datos, no de solo carga).
- Un equipo con
adb. Yo tire de un live de Ubuntu 24, vale cualquiera. - Dos APK de fuentes fiables:
- Immortal launcher, del repo oficial
github.com/starbrightlab/immortal, seccion Releases. Ojo que hay un juego RPG con el mismo nombre en tiendas de APK; no es ese. - Home Assistant Companion, flavor minimal, de F-Droid o de las Releases de
github.com/home-assistant/android(assets marcados-minimal).
- Immortal launcher, del repo oficial
Sobre HA: aqui la version minimal no es opcional, es obligatoria. La normal depende de Google Play Services y en un dispositivo sin GMS falla. La minimal renuncia a location tracking, Matter y sensores de actividad, que en un dispositivo de este tipo no vamos a echar de menos.
Encontrar el puerto USB
Primer obstaculo, y fisico. La toma que se ve a simple vista es el jack de corriente de barril, no el puerto de datos. El USB-C esta escondido a proposito, y la posicion cambia segun la revision: en muchos Portal esta bajo la goma trasera, pero en mi Portal Mini (DT90GB) el USB-C de datos estaba detras de la malla del altavoz trasero, algo que no encontre documentado en ningun sitio. Dejo la foto por si tienes la misma revision, porque no hay ninguna imagen de esto a dia de hoy:

Habilitar ADB y conectar
Con el toggle de ADB activado y el cable puesto, lo primero:
adb devices
Y aqui llego el primer susto: salia vacio. La causa la indica lsusb:
lsusb | grep -i portal
Bus 003 Device 005: ID 0000:0000 Facebook PortalMini
Ese 0000:0000 significa que el Portal esta enumerando en un modo de fallback, sin VID/PID validos, y por tanto sin interfaz ADB que reclamar. Se confirma mirando la clase de interfaz USB:
lsusb -v -d 0000:0000 2>/dev/null | grep -i -A2 binterfaceclass
Si te devuelve 255 / 255 / 0 (vendor generico) en vez de 255 / 66 / 1 (la firma de ADB), es que el modo ADB no ha arrancado. La solucion que me funciono fue desactivar y reactivar el toggle de USB debugging en el Portal, con el cable ya conectado, mirando dmesg -w en paralelo. Al reactivarlo, el dispositivo reenumera:
usb 3-2: New USB device found, idVendor=2ec6, idProduct=1902
usb 3-2: Product: PortalMini
usb 3-2: Manufacturer: Facebook
Ahora si, VID/PID validos: 2ec6:1902 es el vendor de Meta en modo ADB. Le decimos a adb que confie en ese vendor y añadimos regla udev para los permisos:
mkdir -p ~/.android
echo "0x2ec6" > ~/.android/adb_usb.ini
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2ec6", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-portal.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
adb kill-server && adb start-server
adb devices
La primera vez saldra unauthorized: acepta el dialogo RSA en la pantalla del Portal (marca "always allow") y ya tendras device.
Si quieres trabajar sin cable durante la instalacion, pasa a ADB por red, dejando un margen tras tcpip porque el daemon tarda un par de segundos en levantar:
adb tcpip 5555
sleep 3
adb connect IP_DEL_PORTAL:5555
No te molestes en hacerlo persistente con persist.adb.tcp.port: sin root el shell no tiene permiso y falla. Asume que cada reinicio mata ADB y que hay que reactivarlo por USB desde el menu de Meta. Esta limitacion es la raiz de los dos errores del final, asi que tenla presente.
Instalar launcher y app de HA
adb install app-minimal-release.apk
adb install immortal.apk
adb shell pm list packages | grep -i -E 'immortal|homeassistant'
package:io.homeassistant.companion.android.minimal
package:com.immortal.launcher
Abrimos HA y lo dejamos configurado y logueado contra nuestra instancia antes de tocar cualquier otra cosa:
adb shell monkey -p io.homeassistant.companion.android.minimal 1
En pantalla metemos la URL interna de HA y verificamos que el dashboard carga y se mantiene. Si HA crashea aqui, no sigas: hay que resolverlo primero (ver errores).
Immortal como launcher
adb shell cmd package set-home-activity "com.immortal.launcher/.HomeActivity"
adb shell input keyevent KEYCODE_HOME
Deberia aparecer el grid de Immortal. Desde sus ajustes (en el dispositivo, no por ADB) ponemos Home Assistant como app de arranque automatico, para que al encender el Portal entre directo a HA con Immortal debajo de red de seguridad.
Un extra util: Portal OS oculta los Settings estandar de Android, pero siguen accesibles por intent. Guarda este comando, es tu puerta a wifi/idioma/fecha sin pasar por la capa de Meta:
adb shell am start -n com.android.settings/.Settings
Verificar antes de debloatear
Regla de oro del montaje: antes de desactivar nada de Meta, reinicia y confirma que Immortal arranca solo y que HA salta automaticamente (y que recuperas ADB por USB tras ese reinicio). Solo entonces pasa al debloat. Si desactivas apps y despues descubres que el arranque falla, te puedes quedar sin escritorio y sin vuelta atras comoda.
Quitar el bloat de Meta
Con el arranque validado, desactivamos las apps sociales que no vamos a usar. Siempre con disable-user, que es reversible con pm enable y que ademas se revierte entero con un factory reset (no borramos nada permanente):
adb shell pm disable-user --user 0 com.facebook.aloha.app.whatsapp
adb shell pm disable-user --user 0 com.facebook.aloha.app.messenger
adb shell pm disable-user --user 0 com.facebook.aloha.app.portalfeed
adb shell pm disable-user --user 0 com.facebook.aloha.app.storytime
adb shell pm disable-user --user 0 com.facebook.aloha.app.cameraeditor
adb shell pm disable-user --user 0 com.facebook.alohaapps.superframe
adb shell pm disable-user --user 0 com.facebook.alohaapps.contacts
adb shell pm disable-user --user 0 com.facebook.alohaapps.personaluser
adb shell pm disable-user --user 0 com.facebook.alohaservices.alohausers
adb shell pm disable-user --user 0 com.facebook.portal.aiservice
adb shell pm disable-user --user 0 com.facebook.aloha.fbttsservice
adb shell pm disable-user --user 0 com.facebook.aloha.analytics
adb shell pm disable-user --user 0 com.facebook.alohasdk.pushnotification
adb shell pm disable-user --user 0 com.facebook.alohaapps.bugreporter
adb shell pm disable-user --user 0 com.facebook.aloha.websafety
adb shell pm disable-user --user 0 com.facebook.aloha.disv2
adb shell pm disable-user --user 0 com.facebook.alohaservices.player2
Intocables
Esto es lo que NUNCA hay que desactivar. Aqui esta casi todo el peligro:
com.facebook.portal.webview: es el motor WebView del sistema y HA lo necesita para renderizar el frontend. Sin fallback, tumbarlo deja a HA sin motor y crashea en el splash.com.facebook.alohaapps.settings,com.facebook.aloha.rro.niu.settings,com.facebook.alohasdk.settingsycom.facebook.alohaapps.controlcenter: son el unico acceso al toggle de ADB. Si los tumbas, pierdes la forma de reactivar ADB tras el siguiente reinicio.- Todos los
system.*,deviceidentity,dpc,deviceadmin,platformmobileconfig,alohainstaller,appverifier: plumbing del dispositivo.
El launcher de Meta (com.facebook.alohaapps.launcher) si se puede desactivar, pero el ultimo de todos y solo tras confirmar que Immortal es el home tras un reinicio.
Los dos errores que me costaron dos factory resets
Esta es, con diferencia, la parte mas interesante si es tu primera vez con un Portal, son fallos que no salen en los tutoriales.
Error 1: desactivar el WebView de Meta. En el primer intento meti com.facebook.portal.webview en el debloat. Resultado: HA arrancaba, mostraba el splash y se cerraba sin ningun error. Un crash silencioso. La causa la confirme con:
adb shell dumpsys webviewupdate
que mostraba Current WebView package: com.facebook.portal.webview y, lo grave, Fallback logic enabled: false. Ese paquete es el motor WebView del sistema y no hay ninguno de reserva. HA usa WebView para pintar el frontend, se quedaba sin motor y moria en el arranque. No lo toques.
Error 2: quedarme sin acceso al toggle de ADB. Este es el gordo, y me ha pasado dos veces. El toggle de ADB vive en la UI de ajustes de Meta y vuelve a estado deshabiliatdo en cada reinicio (no se puede persistir sin root). Si desactivas las apps de settings o el control center de Meta y luego reinicias, te encuentras con que:
- El toggle de ADB ha desaparecido de los ajustes de Meta.
- El toggle equivalente en las Opciones de desarrollador de Android existe pero no hace nada al pulsarlo, porque el ADB real lo gobierna la capa de Meta, no el switch de AOSP.
Y sin ADB ni menu para reactivarlo, la unica salida es el factory reset. Me paso dos veces por lo mismo: la segunda, por desactivar el control center pensando que era inofensivo.
La regla definitiva: mientras trasteas, deja siempre activas las apps de settings y control center de Meta, y no reinicies nunca con el menu de ADB ya inaccesible. Para un wallpanel publico da igual que esas apps existan, porque el aislamiento lo da Immortal mostrando solo HA, no el borrarlas.
Factory reset, por si acaso
Si acabas en el callejon, el reset por hardware del Mini (confirmado por la doc de Meta) es:
- Desconecta el Portal de la corriente.
- Manten pulsados volumen abajo + volumen arriba a la vez.
- Sin soltar, reconecta la corriente.
- Sigue pulsando unos 10 segundos hasta el aviso de restablecimiento, y aguanta toda la cuenta atras.
Ten paciencia con el primer arranque tras el wipe: puede tardar 2-3minutos.
Cierre
Con Immortal de launcher y la app minimal de HA, un Portal Mini de segunda mano se queda como un wallpanel domotico solvente y baratisimo, con mejor pantalla y audio que casi cualquier alternativa de su precio. Y como bonus, la integracion MQTT que trae Immortal deja controlar el encendido y apagado de la pantalla desde el propio HA en el caso de que no te animes con BrowserMod que es con lo que yo trabajo estos detalles.
El proceso tiene sus peculiaridades, pero sabiendo de antemano los dos puntos delicados (el WebView del sistema y lo fragil que es el toggle de ADB) se hace sin sobresaltos.