Skip to content

Latest commit

 

History

History
430 lines (310 loc) · 16.1 KB

IGW5000.es.md

File metadata and controls

430 lines (310 loc) · 16.1 KB

Reutilización de Movistar Home

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.

🇺🇸 English version

Notas de investigación (en inglés)

SE NECESITA AYUDA

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!

Lista de tareas

  • 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)

Especificaciones

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

Estado de los drivers

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+

Instalación de Linux

Desmontaje

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:

inside-with-usb-port-location

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:

igw5000-usb-port-connection-1

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.

bios

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.

Configuraciones

Las siguientes configuraciones se realizaron para Manjaro con XFCE y es posible que necesiten algunas modificaciones para las otras distribuciones o entornos de escritorio.

Corregir la rotación de la pantalla

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).

Arreglar la pantalla táctil

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

Arreglar el control tactil en Firefox

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.

Reducción automática de brillo

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.

Teclado virtual

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.

Ocultar cursor del ratón

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

Home Assistant dashboard

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.

Controlar el estado de la pantalla desde Home Assistant

Tip

Como se menciona en ArchLinux Wiki, para que el xset pueda controlar la DPMS, necesitas desactivar:

  1. La reducción de brillo de pantalla en Administrador de energía de Xfce.
  2. 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.

Evitar que la pantalla se queme

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="").