como un panel de dashboard para Home Assistant.
Este documento solo está destinado al modelo IGW-5000A2BKMP-I v2
con una CPU x86 de Intel. Para el modelo RG3205W
con un SoC arm64 de Qualcomm, por favor consulta RG3205W.es.md.
Notas de investigación (en inglés)
He descargado el firmware original de Android-x86 en la memoria flash, pero no se pudo iniciar después de que lo volví a escribir, además la partición /data estaba cifrada y no pude encontrar una manera de descifrarla.
Las contribuciones al repositorio son muy bienvenidas si tienes algunos descubrimientos; o si tienes una Movistar Home que no estás usando y quieres ayudar en este proyecto, por favor únete a nuestro grupo de Telegram, ¡muchas gracias!
- Arreglar el driver de la tarjeta de sonido (quizás las configuraciones de ALSA)
- Arreglar el driver de la cámara
- Arreglar el driver de bluetooth
- Arreglar el botón de reinicio
- Encontrar una manera de instalar Linux sin desmontar ni soldar (quizás a través del easycwmp en el puerto 7547)
CPU | Intel Atom x5-Z8350 (4C4T) @ 1,44 GHz |
RAM | Hynix 2 GB DDR3 ECC @ 1600 MHz |
Almacenamiento | Kingston TB2816 16 GB eMMC |
Pantalla | 8 pulgadas 1280x800 con pantalla táctil de I2C de Goodix |
Wi-Fi & Bluetooth | Realtek RTL8822BE |
Tarjeta de sonido | Realtek RT5672 |
Altavoces | 2 x 5 W (SPL 87 dB @ 1 W | 1 m) |
Micrófonos | 4 micrófonos omnidireccionales con DSP dedicado |
Cámara | OMNIVISION OV2680 con 2 megapíxeles |
Medidas | 21,2 x 23,5 x 12,2 cm (alto x ancho x fondo) |
Peso | 1,1 kg |
Como en el último Manjaro XFCE 24.0.2 con kernel 6.9.3-3, el 19 de junio de 2024:
Dispositivo | Driver | Estado |
---|---|---|
Pantalla táctil | goodix_ts | OK |
Wi-Fi | rtw88_8822be | OK |
Bluetooth | rtw88_8822be | No funciona |
Tarjeta de sonido | snd_soc_sst_cht_bsw_rt5672 | No funciona |
Cámara | atomisp | No funciona en kernel 5.15, no disponible en kernel 6.2+ |
Desmonta el dispositivo, tiene 10 presillas debajo de los bordes del panel posterior, ten cuidado de no dañarlos; luego hay 8 tornillos debajo del panel, y 4 tornillos ocultos debajo de la tira de goma en la parte de abajo del dispositivo.
Localiza el puerto micro USB desocupado en el borde izquierdo de la placa base:
Suelda un conector hembra de micro USB y conecta un cable adaptador OTG; o simplemente suelda un cable con un conector hembra de USB-A estándar, luego cortocircuita el cuarto pin (o el pad ID
) a tierra (GND, el quinto pin), haciendo que el dispositivo funcione como un OTG host.
Aquí es un ejemplo para soldar un conector USB-A hembra:
Flashea un pendrive USB con tu distribución de Linux favorita, recomiendo usar el entorno de escritorio Xfce ya que el Movistar Home solo tiene 2 GB de RAM.
Conecta un teclado y el pendrive a un hub de USB y conéctalo al Movistar Home. Enciéndelo mientras presiona la tecla F2
, se iniciará a la configuración del BIOS, navega a la última pestaña (Save & Exit
), selecciona tu pendrive (debería ser algo así como UEFI: USB, Partition 1
) en el menú Boot Override
, presiona la tecla Intro
(Enter
) para iniciarlo.
Instala tu distribución de Linux como de costumbre, puede ser necesario incluir los drivers non-free.
Se recomienda configurar el servidor OpenSSH antes de desoldar el conector USB y volver a montar el dispositivo, para los posibles mantenimientos en el futuro.
Las siguientes configuraciones se realizaron para Manjaro con XFCE y es posible que necesiten algunas modificaciones para las otras distribuciones o entornos de escritorio.
Instala el driver xf86-video-intel
con el comando sudo pacman -S xf86-video-intel
.
Crea el archivo /etc/X11/xorg.conf.d/20-monitor.conf
con el siguiente contenido:
Section "Monitor"
Identifier "DSI1"
Option "Rotate" "right"
Option "DPMS" "true"
EndSection
Section "ServerFlags"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
En la configuración de pantalla de Xfce, ajusta la escala a tu gusto, descubrí que 0.8x es el más adecuado para esta pantalla (1024x640).
Por alguna razón, la pantalla táctil no funciona en absoluto a menos que se reinicie por una vez, en dmesg el driver dice "Goodix-TS i2c-GDIX1001:00: Invalid config (0, 0, 0), using defaults".
Crea el archivo /etc/systemd/system/fix-touchscreen.service
con el siguiente contenido:
[Unit]
Description=Arreglar la pantalla táctil
[Service]
Type=oneshot
ExecStart=sh -c 'dmesg | grep -q " Goodix-TS .*: Invalid config " && reboot now || exit 0'
[Install]
WantedBy=multi-user.target
Ejecuta sudo systemctl daemon-reload && sudo systemctl enable fix-touchscreen.service
para que se ejecute al iniciar.
Para corregir la rotación, crea el archivo /etc/X11/xorg.conf.d/30-touchscreen.conf
con el siguiente contenido:
Section "InputClass"
Identifier "calibration"
MatchProduct "Goodix Capacitive TouchScreen"
Option "TransformationMatrix" "0 1 0 -1 0 1 0 0 1"
EndSection
Fuente: Firefox/Tweaks - ArchWiki
Abre la Firefox y acceda a about:config
, busca por dom.w3c_touch_events.enabled
y asegúrase de que está configurado a 1 (habilitado) o 2 (predeterminado, detección automática).
Añade MOZ_USE_XINPUT2 DEFAULT=1
a /etc/security/pam_env.conf
.
Modifica el archivo /etc/mkinitcpio.conf
para incluir i915
y pwm-lpss-platform
en la matriz MODULES
como sigue:
...
MODULES=(i915 pwm-lpss-platform)
...
Y ejecuta sudo mkinitcpio -P
para regenerar el initramfs.
Crea el archivo /etc/X11/xorg.conf.d/10-intel.conf
con el siguiente contenido:
Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "AccelMethod" "sna"
Option "TearFree" "true"
Option "Backlight" "intel_backlight"
EndSection
Abre el Administrador de energía
de Xfce, cambia a la pestaña Pantalla
y ajusta la configuración de Reducción de brillo
. Personalmente lo configuré para que se reduzca al 20% después de 90 segundos de inactividad.
También recuerda a deshabilitar la suspensión/apagar automática desde allí.
Crea el archivo /etc/udev/rules.d/backlight.rules
con el siguiente contenido:
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="intel_backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness", ATTR{brightness}="100"
Y mejor deshabilitar el servicio systemd-backlight con sudo systemctl mask systemd-backlight@backlight\:intel_backlight.service
, para evitar que interfiera.
Instala Onboard con sudo pacman -S onboard
, abre la configuración Sesión e inicio
de Xfce, cambia a la pestaña Autoarranque de aplicaciones
, busca y habilita Onboard (Teclado en pantalla flexible)
.
Después de reiniciar, abre la configuración de Onboard y ajústala a tu gusto.
Instala unclutter con sudo pacman -S unclutter
.
Crea el archivo ~/.config/autostart/hide-cursor.desktop
con el siguiente contenido:
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=Ocultar cursor
Comment=Ocultar cursor del ratón
Exec=unclutter --hide-on-touch
OnlyShowIn=XFCE;
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false
Crea el archivo ~/.config/autostart/HASS.desktop
con el siguiente contenido:
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=HASS Dashboard
Comment=Ejecute el dashboard de HASS en el mode quiosco de Firefox
Exec=firefox -kiosk -url 'https://tu.hass.url'
OnlyShowIn=XFCE;
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false
Ejecutará Firefox en modo quiosco al iniciar, del que solo puedes salir presionando Alt+F4
o usando el comando kill
a través de SSH.
Tip
Como se menciona en ArchLinux Wiki, para que el xset
pueda controlar la DPMS, necesitas desactivar:
- La reducción de brillo de pantalla en
Administrador de energía
de Xfce. - El
XScreenSaver
de Xfce.
Crea el archivo ~/panel_server.py
con el siguiente contenido:
#!/usr/bin/env python3
import logging
import os
from subprocess import run
from time import sleep
from flask import Flask, request
from werkzeug.wrappers import Request, Response
TOKEN = os.environ.get('TOKEN', '')
class middleware():
def __init__(self, app):
self.app = app
def __call__(self, env, start_resp):
request = Request(env)
if TOKEN != '' and request.headers.get('Authorization') != f'Bearer {TOKEN}':
res = Response('Unauthorized', mimetype='text/plain', status=401)
return res(env, start_resp)
return self.app(env, start_resp)
app = Flask(__name__)
app.wsgi_app = middleware(app.wsgi_app)
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
@app.route('/display/state', methods=['GET'])
def get_display_state():
cmd = f"xset -display :0.0 q | grep '^ Monitor is' | awk '{{print $NF}}'"
state = run(cmd, shell=True, capture_output=True).stdout.decode().strip()
if state == 'On':
return 'ON', 200
elif state == 'Off':
return 'OFF', 200
else:
return f'Unknown state "{state}"', 500
@app.route('/display/state', methods=['POST'])
def set_display_state():
req_body = request.get_data().decode()
if req_body == 'OFF':
cmd = f'xset -display :0.0 dpms force off'
elif req_body == 'ON':
cmd = f'xset -display :0.0 dpms force on'
else:
return 'Bad Request', 400
ret = run(cmd, shell=True).returncode
if ret == 0:
return req_body, 200
else:
return f'Command returned {ret}', 500
def init_display():
while True:
out = run(f"xset -display :0.0 q | grep '^ DPMS is '", shell=True, capture_output=True).stdout.decode()
if 'Disabled' in out or 'Enabled' in out:
break
sleep(3)
ret = run(f'xset -display :0.0 dpms force on', shell=True).returncode
if ret != 0:
print(f'Failed to turn on display: command returned {ret}')
exit(ret)
if __name__ == '__main__':
init_display()
app.run(host=os.environ.get('HOST', '0.0.0.0'), port=os.environ.get('PORT', 8080))
Ejecuta sudo pacman -S python-flask
para instalar Flask.
Crea el archivo ~/.config/systemd/user/panelserver.service
con el siguiente contenido:
[Unit]
Description=Panel Server
After=network-online.target nss-lookup.target graphical-session.target
[Service]
Environment="TOKEN=aa83720a-0bc1-4d5b-82fc-bf27a6682aa4" # reemplázalo con tu clave secreta
NoNewPrivileges=true
ExecStart=/usr/bin/python3 /home/panel/panel_server.py # reemplázalo con tu ruta real
Restart=always
[Install]
WantedBy=default.target
Ejecuta systemctl --user daemon-reload && systemctl --user enable --now panelserver.service
para que se ejecute al iniciar.
Crea un interruptor de RESTful en la configuración YAML de tu Home Assistant como:
- platform: rest
name: Pantalla del Panel
unique_id: pantalla_panel
resource: http://panel:8080/display/state # reemplaza `panel` con el nombre de host o la dirección IP de tu panel
body_on: 'ON'
body_off: 'OFF'
is_on_template: '{{ value == "ON" }}'
headers:
Authorization: Bearer aa83720a-0bc1-4d5b-82fc-bf27a6682aa4 # reemplázalo con tu clave secreta (después de `Bearer `)
verify_ssl: false
icon: mdi:tablet-dashboard
Recarga tu instancia de Home Assistant, usa las Herramientas de desarrollador para probar el interruptor y el sensor.
Luego puedes usarlo en las Automatizaciones, por ejemplo, apagarlo cuando te vas a dormir por la noche y volver a encenderlo cuando te levantas por la mañana.
Dado que se usará principalmente para mostrar un dashboard de Home Assistant todos los días, es muy probable que la pantalla se queme después de un tiempo, aunque tiene una pantalla LCD.
Para evitarlo, escribí un script de Python para que muestre periódicamente varios colores en pantalla completa para actualizar todos los píxeles, también actualiza la pestaña del navegador al mismo tiempo, para evitar posibles bloqueos.
Caution
¡NO USA este script si tú o un miembro de tu familia tiene epilepsia fotosensible!
Crea el archivo /usr/bin/screensaver.py
con el siguiente contenido:
#!/usr/bin/env python3
import os
import threading
import tkinter as tk
from subprocess import run
from time import time
color_interval = int(os.environ.get('COLOR_INTERVAL', 300)) # milliseconds
total_time = int(os.environ.get('TOTAL_TIME', 10)) # seconds, exit after that
colors = ['red', 'green', 'blue', 'black', 'white']
root = tk.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(True)
root.attributes('-fullscreen', True)
canvas = tk.Canvas(root, width=w, height=h, background='black', highlightthickness=0)
canvas.pack()
canvas.focus_set()
canvas.bind('<Button-1>', lambda _: root.destroy()) # saldrá al tocar
color_index = 0
def show_color():
global color_index
if time() - time_start > total_time:
root.destroy()
return
canvas.configure(background=colors[color_index])
color_index = (color_index + 1) % len(colors)
root.after(color_interval, show_color)
def refresh_browser(window_class: str):
window_id = run(f'xdotool search --onlyvisible --class "{window_class}" | head -1',
shell=True, capture_output=True).stdout.decode().strip()
ret = run(f'xdotool windowactivate {window_id}', shell=True).returncode
if ret != 0:
print(f'Failed to activate window {window_id}')
ret = run(f'xdotool key F5', shell=True).returncode
if ret != 0:
print(f'Failed to send F5 key to window {window_id}')
# actualiza la pestaña del navegador
browser_window_class = os.environ.get('BROWSER_WINDOW_CLASS', '')
if browser_window_class:
refresh_thread = threading.Thread(target=refresh_browser, args=(browser_window_class,))
refresh_thread.start()
# protector de pantalla
time_start = time()
show_color()
root.mainloop()
Instala los paquetes necesarios con sudo pacman -S tk xdotool
, ejecuta el comando sudo chmod +x /usr/bin/screensaver.py
para hacerlo ejecutable, luego ejecuta el comando crontab -e
y agrega un trabajo de cron como sigue, que ejecutará el script cada hora:
0 * * * * DISPLAY=:0 COLOR_INTERVAL=300 TOTAL_TIME=10 BROWSER_WINDOW_CLASS="firefox" /usr/bin/python3 /usr/bin/screensaver.py
Ajusta las dos variables de entorno COLOR_INTERVAL
y TOTAL_TIME
a tu gusto, con un TOTAL_TIME
de 10 estará ejecutándose durante 10 segundos. Si necesitas detenerlo inmediatamente, simplemente toca la pantalla.
Si utilizas otro navegador (por ejemplo, chromium
), cambia el valor de BROWSER_WINDOW_CLASS
en consecuencia; si no deseas actualizar la pestaña del navegador, hazlo vacío (BROWSER_WINDOW_CLASS=""
).