No rompa la ley, sea amable con tus hijos, y no olvide que eres responsable de lo que haces con tus propios dispositivos.
yNo rompa la ley, sea amable con tus hijos, y no olvide que eres responsable de lo que haces con tus propios dispositivos.
El problema del que nadie habla
El paradojo del sueño digital En una era en la que las pantallas dominan las rutinas de la hora de acostarse, millones ahora se duermen a vídeos de YouTube, podcasts o aplicaciones de streaming.
Sin embargo, este hábito tiene un coste oculto: exposición incontrolada al volumen, especialmente para los niños.Como padre y desarrollador, me he enfrentado a este problema de primera mano: los bingos de YouTube tardíos de mi hijo llevaron al sueño inquieto y la irritabilidad matutina.
Aplicaciones gratuitas en la tienda de Google Play, comoVolumen limitado, deControl de volumenfueron un fracaso: se colapsaron, no tenían configuraciones, o eran demasiado intrusivas.Puede que las aplicaciones comerciales fueran mejores, pero no he probado esto ya que cuestan dinero, a menudo bastante.
The Hack (Totalmente ilegal...ish)
He construido un script que se conecta a su dispositivo Android inalámbricamente y mantiene un ojo en su volumen. Si se hace demasiado fuerte - lo baja suavemente.
Sí, técnicamente, utiliza ADB (Android Debug Bridge) sobre Wi-Fi, que es una herramienta de desarrollador y no está destinado a la paternidad antes de dormir.
Crea tu entorno de desarrollo
Establecer un entorno de desarrollo y la conectividad es crucial antes de sumergirse en el código. Esto garantizará que tenga todas las herramientas y bibliotecas necesarias, simplificando el proceso de desarrollo.
Yo uso macOS, así que todos los ejemplos en la historia serán con este sistema, pero el uso de Windows no hace que el proceso sea mucho más difícil en comparación con macOS.La única diferencia es que en el sistema operativo MacOS, Python ya está instalado, y en Windows, tendrás que instalar Python tú mismo desde aquí:Windows en Python
Aquí hay una descomposición más detallada:
- y
- Descargar y extraer herramientas de plataforma: Ir al sitio web oficial de Android Developers: Navegar a Android SDK Platform-Tools. Descargar herramientas de plataforma SDK: Descargar la última versión para su sistema operativo (Windows, macOS o Linux). Extraer el archivo ZIP: Extraer el archivo ZIP descargado a una ubicación de su elección (por ejemplo, C:\adb en Windows). y
- Añadir herramientas de plataforma al PATH de su Sistema: Windows: Abra las configuraciones de "Variables del Medio Ambiente" (buscar "Variables del Medio Ambiente" en el menú Inicio). Haga clic en "Editar las variables del entorno del sistema". Haga clic en "Variables del Medio Ambiente". En la sección "Variables del Sistema", encuentre la variable "Path", seleccione la misma y haga clic en "Edit". Haga clic en "Nuevo" y agrega el camino al directorio de herramientas de plataforma (por ejemplo, C:\adb). macOS/Linux: Abra su terminal. Añade el camino al directorio de herramientas de plataforma al archivo de configuración de su shell (por ejemplo, ~/.bashrc, ~/.zshrc). Por ejemplo: exporta PATH=$P y
- Verificar la instalación de ADB: Abrir una interfaz de línea de comandos (CLI): Usando la barra de búsqueda de Windows (Windows OS): Haga clic en el botón Inicio o en el icono de vidrio amplificador en la barra de tareas. Introduzca "cmd" (sin citas) en la barra de búsqueda. Haga clic en el resultado de "Command Prompt". Para ejecutarlo como administrador, haga clic con el botón derecho en "Command Prompt" en los resultados de búsqueda y seleccione "Executar como administrador". Usando Spotlight Search (macOS): Haga clic en el icono de vidrio amplificador en la barra de menús (o presione Cmd+Space). Introduzca "Terminal" y haga doble clic para abrirlo. Introduzca adb y
- Activar el Debugging USB en su dispositivo Android: Vaya a "Configuraciones" en su dispositivo Android. Desliza hacia abajo y seleccione "Sobre el teléfono". Encuentre "Construir Número" y toque 7 o más veces para desbloquear Opciones de desarrollador. Vuelva a la página principal "Configuraciones" y ahora verá "Opciones de desarrollador". Seleccione "Opciones de desarrollador". Desliza hacia abajo a "Debugging USB" y desplácelo. y
A partir de ahora, solo trabajaremos en la línea de comandos. En mi caso, será el terminal.
Establecimiento de tu conexión
El siguiente paso será conectar su dispositivo móvil con su PC. Este es un paso relativamente simple que consta de dos partes:
- y
- Conexión por cable; y
- Conexión inalámbrica. y
Conexión por cable:
Debe conectar su dispositivo móvil a su PC utilizando el cable (USB A/USB C o USB A/micro USB, etc.).
Después de esto, abre el terminal y escribe el siguiente comando:
adb devices
Por el momento, estamos listos para activar el modo TCP/IP con el siguiente comando:
adb tcpip 5555
Si ya estamos en el terminal, entonces podemos comprobar la dirección IP del dispositivo móvil en nuestra red Wi-Fi sin mirar al dispositivo móvil.
adb -d shell "ip route | awk '/wlan0/ {print \$9}'"
Conexión inalámbrica:
Ahora que tienes la dirección IP de tu dispositivo, es hora de conectarte inalámbricamente.Ya no es necesario una conexión inalámbrica.adb tcpip 5555
, puede desconectar de forma segura el cable USB. El resto de la magia sucederá a través de Wi-Fi.
Asegúrese de que tanto su teléfono inteligente como su ordenador estén en la misma red Wi-Fi.
adb connect <DEVICE_IP>:5555
Por ejemplo, si el IP de su dispositivo es10.0.0.108
Usted entraría en:
adb connect 10.0.0.108:5555
If all goes well, you'll see a message like:
Hablemos de nuevo del problema
Tomemos un paso atrás y recordemos lo que estamos resolviendo. Su hijo se duerme tranquilo viendo un vídeo silencioso - tal vez una historia de la hora de dormir o algunos sonidos relajantes. Pero dos horas más tarde? el auto-play de YouTube empieza, un ruido de anuncios, o alguna banda sonora de dibujos animados de alta energía los despierta. Son groggy. Usted es groggy. Todo el mundo comienza su día ya drenado. Lo que necesitábamos era un guardián silencioso - algo invisible y confiable. Un sistema que bajaría suavemente el volumen en el fondo sin detener la reproducción, sin flashing irritantes pop-ups, y sin despertar al usuario. Eso es exactamente lo que hace este guión.
La arquitectura a la vista
Aquí hay un diagrama rápido que muestra cómo todo se conecta:
ySu ordenador (executando el script Python) se conecta al dispositivo Android a través de ADB a través de Wi-Fi, monitora el volumen periódicamente y lo reduce si es necesario.
y
Su ordenador (executando el script Python) se conecta al dispositivo Android a través de ADB a través de Wi-Fi, monitora el volumen periódicamente y lo reduce si es necesario.
El guión que hace la magia
El núcleo de la solución es un script Python que comunica con su dispositivo Android a través de ADB a través de Wi-Fi.
Si el volumen está por encima de 5 (Android normalmente utiliza una escala de 15 puntos), el script lo baja suavemente - un paso a la vez, con breves pausas.
La mejor parte? Respeta los cambios manuales. Si alguien baja el volumen por sí mismo, el guión se da cuenta y no interfiere. Es silencioso. Es adaptativo. Es invisible - igual que debería ser un buen asistente para dormir.
Evolución del guión: de Tiny Hack a herramienta fiable
Cuando escribí por primera vez este guión, apenas tenía unas pocas líneas.
Parecía algo así:
import subprocess
import time
import re
def get_stream_volume():
cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'"
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
match = re.search(r'streamVolume:(\d+)', result.stdout)
return int(match.group(1)) if match else None
def set_volume(level):
cmd = f"adb shell cmd media_session volume --stream 3 --set {level}"
subprocess.run(cmd, shell=True)
print(f"Volume set to {level}")
def monitor_volume():
while True:
volume = get_stream_volume()
if volume is None:
print("Failed to get volume level. Retrying...")
time.sleep(5)
continue
print(f"Current volume: {volume}")
if volume == 15:
for vol in range(14, 4, -1):
set_volume(vol)
time.sleep(30)
while get_stream_volume() == 5:
print("Volume is at 5, monitoring every 60 seconds...")
time.sleep(60)
if __name__ == "__main__":
monitor_volume()
os.system("adb shell dumpsys audio | grep -i 'streamVolume'")
¿Qué pasa si el dispositivo se desconecta en la mitad de la noche? ¿Qué pasa si ADB hace una pausa? ¿Qué pasa si el teléfono no está emparejado? ¿Qué pasa si el guión se rompe mientras todos duermen?
El guión evolucionó.
- y
- A veces, el dispositivo no estaba conectado. Así que agregé adb connect ip:port. y
- A veces ADB se estrelló a medianoche. agregé manejo excepcional y retries. y
- ¿Y eso? añadió también. y
- ¿Logging de archivos y logging de consola? y
- Ahora, el guión sigue eso también —y sólo interviene cuando es necesario. y
- Monitoring frequency? Different intervals for high vs. low volume levels. y
- Y sí, el apagado gracioso Ctrl + C. y
Lo que comenzó como unas pocas líneas de guión se convirtió en un pequeño perro de guardia que cuida de tu teléfono, así que no tienes que hacerlo.
import subprocess
import time
import re
import logging
from datetime import datetime
logging.basicConfig(
filename='volume_control.log',
level=logging.INFO,
format='[%(asctime)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
ADB_DEVICE = "10.0.0.108:5555"
def log(message):
timestamp = get_timestamp()
print(f'[{timestamp}] {message}')
logging.info(message)
def get_timestamp():
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def connect_adb():
subprocess.run(f"adb connect {ADB_DEVICE}", shell=True)
log(f"Reconnected to ADB at {ADB_DEVICE}")
def get_stream_volume():
cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'"
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
match = re.search(r'streamVolume:(\d+)', result.stdout)
return int(match.group(1)) if match else None
def safe_get_stream_volume(retries=3, delay=5):
for attempt in range(retries):
volume = get_stream_volume()
if volume is not None:
return volume
log(f"Attempt {attempt + 1}: Failed to get volume. Retrying after reconnect...")
connect_adb()
time.sleep(delay)
log("All attempts failed. Giving up temporarily.")
return None
def set_volume(level):
cmd = f"adb shell cmd media_session volume --stream 3 --set {level}"
subprocess.run(cmd, shell=True)
log(f"Volume set to {level}, waiting 30 seconds...")
def monitor_volume():
while True:
volume = safe_get_stream_volume()
if volume is None:
log("Initial volume read failed. Retrying in 30 seconds...")
time.sleep(30)
continue
log(f"Current volume: {volume}")
while volume > 5:
set_volume(volume - 1)
time.sleep(30)
volume = safe_get_stream_volume()
if volume is None:
log("Failed to read volume during decreasing.")
break
while True:
volume = safe_get_stream_volume()
if volume is None:
log("Failed to read volume during monitoring.")
time.sleep(30)
break
if volume > 5:
log(f"Volume increased to {volume}, restarting decreasing")
break
log(f"Volume is at {volume}, monitoring every 60 seconds...")
time.sleep(60)
if __name__ == "__main__":
try:
monitor_volume()
except KeyboardInterrupt:
log("Script stopped by user (Ctrl+C)")
except Exception as e:
log(f"Unexpected error: {e}")
finally:
log("Script exited.")
Pero asegúrese de cambiar esta línea ADB_DEVICE = "10.0.0.108:5555" en el script con su dirección IP de“Construyendo tu conexión”. el
Ejecutar el guión: dos opciones fáciles, así como Cron
Tienes dos maneras principales de ejecutar el guión:
- y
- Directamente con Python y
Si tienes Python 3 instalado, sólo puedes ejecutar:
python3 reduce_volume.py
Comenzará inmediatamente y hará su trabajo en silencio en el fondo.
- y
- Como un ejecutivo independiente y
¿Quieres compartirlo con alguien que no tenga Python instalado?
Puedes convertir el guión en un standalone.app
Para macOS o.exe
Para Windows, el usoPiñonero: de
pyinstaller --onefile reduce_volume.py
Esto creará una aplicación portátil que se puede iniciar con un doble clic, sin necesidad de Python.
- y
- Incluso planifique con un trabajo cron o un planificador de tareas si usted es fancy. y
Una cosa más: Limitaciones de ADB remotas
Es importante notar que ADB sobre Wi-Fi puede ser frágil.
Su conexión remota se romperá si:
- y
- El teléfono se reinicia. y
- La red Wi-Fi cambia. y
- Modo de desarrollador o Debugging USB se deshabilita. y
- El dispositivo dura demasiado tiempo sin actividad ADB (algunos sistemas automatizan conexiones inactivas). y
- Y muchos otros... y
Por lo tanto, si el script deja de funcionar, simplemente repita los pasos de“Construyendo tu conexión”: de
- y
- Conecte el dispositivo móvil con un cable a su ordenador personal. y
- Executa el comando adb tcpip 5555 adb tcpip 5555 y
- Y ejecutar adb connect <DEVICE_IP>:5555 y
adb connect 10.0.0.108:5555
Y volverás al negocio.
Pensamientos finales
Este hack no se trata de silenciar la diversión de su hijo. Se trata de proteger su sueño - y su sanidad - de sorpresas tecnológicas inesperadas.
Este puede ser un pequeño guión, pero para mi familia y para mí, fue un cambio de vida. No más 2 AM despertamientos de YouTube. No más mañanas cranky. Sólo noches pacíficas y un poco de automatización de la paternidad.
- y
- ¿Es un poco un hacker? y
- ¿Funciona de manera fiable? y
- Técnicamente sí, pero funciona en una zona gris (el acceso ADB y el control automatizado no son oficialmente respaldados por Google para los usuarios finales). y
- Mientras ayude a un padre cansado (o incluso a ti mismo) a dormir mejor, vale la pena.
- Es algo sutil. y
- que es invisible. y
- Y eso funciona. y
Déjame saber si desea el código fuente, una configuración de un clic o una versión mejorada.
Y sí, duerme bien, lo has ganado.
P.S. Esta solución se puede mejorar y ampliar - por ejemplo, establecer un horario, adaptarse a diferentes perfiles, rastrear la actividad del dispositivo, etc. Pero incluso en su forma básica, ya resuelve el problema principal: te ayuda a dormir - y dormir en paz.
yP.S. Esta solución se puede mejorar y ampliar - por ejemplo, establecer un horario, adaptarse a diferentes perfiles, rastrear la actividad del dispositivo, etc. Pero incluso en su forma básica, ya resuelve el problema principal: te ayuda a dormir - y dormir en paz.