tech explorers, welcome!

Etiqueta: unihiker

UNIHIKER-PAL: asistente del hogar simplificado, de código abierto en python

PAL es una versión simplificada de mi asistente del hogar en python, que se ejecuta en una placa UNIHIKER de DFRobot, y que lanzo en código abierto gratuito.

Esta es solo una pequeña demostración de la simplicidad de la ejecución de comandos con reconocimiento de voz en python, y con suerte servirá de guía para tu propio asistente.

Version actual: v0.2.0 (actualizado septiembre 2024)

Características

La versión actual incluye lo siguiente:

  • Reconocimiento de voz: usando la librería de código abierto SpeechRecognition, se obtiene una lista con las cadenas de texto reconocidas.
  • Pronóstico del tiempo: usando la API de datos de World Meteorological Organization, devuelve el tiempo de hoy y el pronóstico de los próximos 3 días. Incluye los iconos de la WMO.
  • Temperatura local: reads local BMP-280 temperature sensor to provide a room temperature indicator.
  • Comandos HTTP para IoT: flujo de trabajo básico para controlar dispositivos inteligentes de IoT mediante comandos HTTP. Actualmente ENCIENDE y APAGA un interruptor inteligente Shelly2.5.
  • Modo ahorro de energía: controla el brillo para reducir el consumo de energía.
  • Gestor de conexión: periódicamente comprueba el wifi y llama a internet para restaurar la conexión cuando se pierda.
  • Muestra de voces de PAL: voz clonada de PAL de "Los Mitchells contra las Máquinas" usando el modelo de IA de voz CoquiAI-TTS v2.
  • Botones UNIHIKER: botón A despliega un simple menú (está pensado para desarrollar un menú más complejo en el futuro).
  • Controles táctiles: restaura el brillo (centro), cambia de programa (izquierda) y cierra el programa (derecha) pulsando en distintas zonas de la pantalla.

Instalación

  1. Instala dependencias:
    pip install SpeechRecognition pyyaml
  2. Descarga el repositorio de github:
    https://github.com/TheRoam/UNIHIKER-PAL
  3. Sube los archivos y carpetas a la UNIHIKER en /root/upload/PAL/
  4. Configura en PAL_config.yaml las credenciales WIFI, dispositivos IoT, etc.
  5. Lanza el script de python python /root/upload/PAL/PAL_020.py desde la terminal de Mind+ o desde la interfaz táctil de UNIHIKER.

Si habilitas Auto boot en el menú de Service Toggle, el script se ejecutará automáticamente cada vez que se reinicie la UNIHIKER

https://www.unihiker.com/wiki/faq#Error:%20python3:%20can't%20open%20file…

Configuración

Version 0.2.0 includes configuration using a yaml file that is read when the program starts.

CREDENTIALS:
ssid: "WIFI_SSID"
pwd: "WIFI_PASSWORD"

DEVICES:
light1:
brand: "Shelly25"
ip: "192.168.1.44"
channel: 0

light2:
brand: "Shelly25"
ip: "192.168.1.44"
channel: 1

light3:
brand: "Shelly1"
ip: "192.168.1.42"
channel: 0

PAL:
power_save_mode: 0
temperature_sensor: 0
wmo_city_id: "195"

Localización

La variable "CityID" se usa para proporcionar un pronóstico del tiempo de WMO más cercano a tu localización.

Elige una de las localizaciones disponibles en su listado oficial:

https://worldweather.wmo.int/en/json/full_city_list.txt

Dispositivos IoT

En este momento, PAL v0.2.0 solo incluye compatibilidad con Shelly2.5 para fines demostrativos.

Usa las variables lampBrand, lampChannel y lampIP para ajustar tu configuración de Shelly2.5.

Esto es solo un ejemplo para mostrar cómo se pueden configurar distintos dispositivos. Estas variables se deberían usar para cambiar las peculiaridades de los comandos HTTP que se envían a cada dispositivo IoT.

Se añadirán más dispositivos en futuras actualizaciones, como Shelly1, ShellyDimmer, Sonoff D1, etc.

Modo ahorro de energía

El ahorro de energía disminuye el brillo del dispositivo para reducir el consumo de energía de la UNIHIKER. Esto se hace usando el comando del sistema "brightness".

Cambia la variable "ps_mode" para habilitar ("1") o deshabilitar ("0") el modo ahorro de energía.

Temperatura de habitación

Cambia la variable "room_temp" para habilitar ("1") o deshabilitar ("0") el módulo de lectura de sensor de temperatura. Esto requiere un sensor BMP-280 instalado mediante el conector I2C.

Comprueba este otro post para los detalles de la instalación del sensor:

https://theroamingworkshop.cloud/b/en/2490/

Otras configuraciones desde el código fuente:

Tema

Se habilita la personalización de la imagen de fondo que representa los ojos de PAL.

Usa las variables "eyesA" y "eyesB" para especificar uno de los siguientes valores y cambia la expresión del PAL:

  • "happy"
  • "angry"
  • "surprised"
  • "sad"

"eyesA" se usa como fondo por defecto y "eyesB" se usa como transición cuando el reconocimiento de voz se activa y PAL habla.

El valor por defecto de "eyesA" es "surprised" y cambiará a "happy" cuando se reconoce un comando.

Comandos personalizados

Añadir tus propios comandos a PAL es simple usando la función "comandos".

Cada audio reconocido por SpeechRecognition se envía como una cadena a la función "comandos", que filtra y lanza uno u otro comando coincidente con la orden.

Solo define todas las posibles cadenas que pueden ser reconozidas para lanzar tu comando (a veces SpeechRecognition devuelve transcripciones erróneas o imprecisas).

Finalmente, define el comando que se lanza cuando la cadena coincide.

def comandos(msg):
    # LAMP ON
    if any(keyword in msg for keyword in ["turn on the lamp", "turn the lights on","turn the light on", "turn on the light", "turn on the lights"]):
        turnLAMP("on")
        os.system("aplay '/root/upload/PAL/mp3/Turn_ON_lights.wav'")

Palabra clave para la activación

Puedes personalizar las palabras clave o cadenas que activan las funciones de comandos. Si cualquiera de las palabras clave en la lista es reconocida, toda la frase se envía a la función "comandos" para buscar un comando coincidente y ejecutarlo.

En caso de PAL v0.2, estas son las palabras clave que lo activan (el 90% de las veces es Paypal...):

activate=[
    "hey pal",
    "hey PAL",
    "pal",
    "pall",
    "Pall",
    "hey Pall",
    "Paul",
    "hey Paul",
    "pol",
    "Pol",
    "hey Pol",
    "poll",
    "pause",
    "paypal",
    "PayPal",
    "hey paypal",
    "hey PayPal"
]

Puedes cambiar esto a cualquier otra frase o nombre para activar a PAL cuando la llames de esa manera.

Voz de PAL

Usa la muestra de audio "PAL_full" abajo (también en el repositorio de github en /mp3) como audio de referencia para la clonación de voz de CoquiAI-TTS v2 y genera tus propias voces:

https://huggingface.co/spaces/coqui/xtts

TIP!
Comprueba este otro post sobre clonación de voz con CoquiAI-XTTS:
https://theroamingworkshop.cloud/b/2429

Demo

A continuación hay algunos ejemplos de consultas y respuestas de PAL:

"Hey PAL, turn on the lights!"
"Hey PAL, turn the lights off"
"Hey PAL, what's the weather like?"

Futuros lanzamientos (To-Do list)

Iré desarrollando estas características en mi asistente personal, e iré actualizando la versión de código abierto de vez en cuando. Ponte en contacto via github si tienes especial interés en alguna de ellas:

  • Menú avanzado: añadir configuración y comandos manuales.
  • Dispositivos IoT: incluir todos los comandos HTTP de Shelly y Sonoff.
  • Consultar la hora: requiere clonar la voz de todas las combinaciones de números...
  • Consulta de Wikipedia/internet: requiere generar voz en tiempo real...
  • Mejoradas animaciones / temas.

Comentarios, problemas o mejoras, me encantará recibirlos en github o Twitter!

🐦 @RoamingWorkshop

🌡UNIHIKER sensor de temperatura en tiempo real funcionando en 2 minutos

Sigo experimentando con la placa UNIHIKER de DFRobot y es increíblemente rápido hacer que las cosas funcionen en ella. Hoy traigo cómo configurar en 2 minutos la visualización en tiempo real de un sensor de temperatura, usando un módulo BMP-280 y absolutamente nada de programación.

Prerrequisitos

Aquí está el truco, y es que esperaba que tuvieras un par de cosas configuradas antes de activar el cronómetro:

  • Descarga e instala Mind+, el IDE para UNIHIKER de DFRobot.
    En Linux se trata de fichero .deb que se toma su tiempo para instalar:
    https://mindplus.cc/download-en.html
  • Suelda un modulo de presión y temperatura BMP-280 y conéctalo a un cable I2C que vienen con la placa. Tendrás que doblar ligeramente algunos pines para que encajen en el conector que parece un nano JST de 1mm.

Ya estás listo!

Configuración

  1. En Mind+, ve al Blocks editor y abre el menú Extensions.
  2. En la pestaña pinpong selecciona el propio módulo pinpong (que habilita la interacción con los pines de la UNIHIKER) y el módulo de extensión BMP-280, que añade la interacción con estos módulos.
  1. Vuelve al Blocks editor y comienza a construir tu bloque de código. Simplemente navega por el menú lateral izquierdo y arrastra todo lo que necesitas debajo del bloque Python program start:
    • pinpong - initialize board.
    • bmp280 - initialize I2C address 0x76 para inicializar el módulo.
    • control - bloque forever (introduce un bucle while True).
    • unihiker - añade objetos a la pantalla. Primero añado un objeto filled rectangle para limpiar texto anterior, luego añado el objeto text. Especifica coordenadas X,Y donde se mostrará cada objeto, al igual que su color.
    • bmp280 - objeto read temperature. Arrástralo dentro del campo de texto del objeto text.
    • python - (opcional) añade un objeto print para mostrar los datos en terminal. Yo he incluido todas las otras propiedades que devuelve el sensor.
    • control - añade un objeto wait para detener el programa durante 1 segundo antes del siguiente bucle.

      Debería quedar todo así (haz click para ampliar)

Ejecución

Y ya está todo el programa montado, sin programar! Pulsa RUN en la parte superior de Mind+ y observa cómo se carga y se muestra por la pantalla de la UNIHIKER. Toca el sensor ligeramente con el dedo para ver cómo varían los valores con el incremento de temperatura.

Han sido sólo 2 minutos no?

🐦 @RoamingWorkshop

Carcasa DFRobot para UNIHIKER

El pequeño y eficiente factor de forma de la UNIHIKER hace que sea muy fácil diseñar una carcasa para ella.

Para my asistente inteligente buscaba un estilo tipo androide, y el logo de DFRobot es perfecto para la UNIHIKER, haciendo un guiño a sus desarrolladores.

Repositorio Github

He publicado un repositorio donde abriré las fuentes (open-source) de todos los archivos de los modelos, pudiendo cualquiera contribuir con los suyos, así que anímate a crear una solicitud de cambios (pull request) y comparte tus diseños!

https://github.com/TheRoam/DFRobot-UNIHIKER-case/

También se incluye una página github donde se pueden previsualizar los modelos:

https://theroam.github.io/DFRobot-UNIHIKER-case/

Unihiker_DFRcase_v1

Mi primer lanzamiento, usado para testear e incluir las funcionalidades básicas para mi asistente.

Archivos

https://github.com/TheRoam/DFRobot-UNIHIKER-case/tree/main/blender

Características

  • Aperturas superiores para mostrar texto en la pantalla táctil.
  • Apertura lateral para conexión de USB-C.
  • Apertura trasera para cableado de sensores externos.
  • Extrusiones traseras para colocación de altavoces de 40mm.
  • Pie de soporte para posicionamiento vertical.

Partes de la carcasa

  1. Pieza inferior: actúa como envoltorio.
  2. Pieza de soporte interior: sostiene la placa UNIHIKER a la pieza inferior usando los tornillos de la placa.
  3. Pieza superior: actúa como tapa encajándose en la pieza inferior.
  4. Pie de soporte: permite posicionamiento vertical.
  5. Antenas: le dan el toque final al logo de DFRobot.

Ensamblaje

  1. Coloca los tornillos en el soporte interior y atorníllalo a la placa UNIHIKER.
  1. Coloca la UNIHIKER dentro de la pieza inferior. Si vas a usar sensores exteriores, saca el cableado por la apertura trasera.
  1. Sujeta la placa a la carcasa con un par de tornillos de 2.5mm desde la parte trasera.
  1. Coloca la pieza superior y encájala con la inferior. Hará click con dos pestañas laterales.
  1. Coloca el pie de soporte y las antenas en su sitio. Puedes pegarlos con pegamento para asegurarte de que no se mueven.

Y ahí tienes tu carcasa montada con un look muy droide!

No olvides compartir tus impresiones en Twitter!

🐦 @RoamingWorkshop