Cámara WebRTC con RaspberryPI para Alexa y Google Home

En esta sección te mostramos cómo crear una cámara de Sinric Pro y ver su imagen en

Requisitos previos :

  1. Raspberry Pi x 1 (bullseye o posterior).
  2. Controlador de cámara x 1.

Sinric Pro webrtc camera intro

¿Qué es WebRTC?

WebRTC (Web Real-Time Communication) es una tecnología que permite la comunicación de audio y vídeo en tiempo real por internet sin necesidad de plugins ni descargas. Es compatible con los principales navegadores, apps y dispositivos de hogar inteligente, como Amazon Eco Show, Chrome Cast y Google Nest, lo que la convierte en una herramienta muy potente para crear aplicaciones de comunicación en tiempo real. WebRTC transmite los datos de audio y vídeo mediante comunicación entre pares (peer-to-peer). Esto significa que el vídeo y el audio se transmiten directamente entre los dos dispositivos que participan en la comunicación, sin pasar por el servidor de Sinric Pro. Así se reduce la latencia y mejora el rendimiento, sobre todo en aplicaciones que se usan a larga distancia.

¿Cómo funciona WebRTC de Alexa y Google Home con Sinric Pro?

Sinric Pro create device alexa

Paso 1: Configura la Raspberry Pi con el módulo de cámara

Para ver cómo configurar la Raspberry Pi con el módulo de cámara, consulta el excelente artículo de la Raspberry Pi Foundation aquí

Paso 2: Configura MediaMTX (antes rtsp-simple-server) para transmitir la cámara de la Pi.

MediaMTX es un servidor multimedia en tiempo real que permite transmitir vídeo y audio por la red. Admite muchos protocolos de streaming, entre ellos RTSP, HLS, SRT, WebRTC y RTMP. Como es compatible de forma nativa con la cámara de la Raspberry Pi, podemos transmitir fácilmente el vídeo de la cámara de la Pi por WebRTC con MediaMTX.

Vamos a configurar MediaMTX.

Para Raspberry Pi arm64:

pi@pi3:~/Desktop/tutorial $ wget https://github.com/bluenviron/mediamtx/releases/download/v0.23.3/mediamtx_v0.23.3_linux_amd64.tar.gz
pi@pi3:~/Desktop/tutorial $ tar -xzvf mediamtx_v0.23.3_linux_amd64.tar.gz
pi@pi3:~/Desktop/tutorial $ rm mediamtx_v0.23.3_linux_amd64.tar.gz

Para Raspberry Pi arm64v8:

pi@pi3:~/Desktop/tutorial $ wget https://github.com/bluenviron/mediamtx/releases/download/v0.23.3/mediamtx_v0.23.3_linux_arm64v8.tar.gz
pi@pi3:~/Desktop/tutorial $ tar -xzvf mediamtx_v0.23.3_linux_arm64v8.tar.gz
pi@pi3:~/Desktop/tutorial $ rm mediamtx_v0.23.3_linux_arm64v8.tar.gz

Al extraer el archivo verás 3 ficheros. mediamtx mediamtx.yml license

pi@pi3:~/Desktop/tutorial $ ls -l
total 36544
-rw-r--r-- 1 pi pi     1062 May 24 16:07 LICENSE
-rwxr-xr-x 1 pi pi 24859649 May 24 16:15 mediamtx
-rw-r--r-- 1 pi pi    19171 Sep 22 12:34 mediamtx.yml

Edita mediamtx.yml para activar la cámara de la RaspberryPi:

paths:
  cam:
    source: rpiCamera

Guarda mediamtx.yml y ciérralo.

Sinric Alexa Camera mediamtx config

Inicia MediaMTX con: ./mediamtx mediamtx.yml

pi@pi3:~/Desktop/tutorial $ ./mediamtx mediamtx.yml

2023/09/22 12:34:58 INF MediaMTX / rtsp-simple-server v0.23.3
2023/09/22 12:34:58 INF [path cam] [rpicamera source] started
2023/09/22 12:34:58 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2023/09/22 12:34:58 INF [RTMP] listener opened on :1935
2023/09/22 12:34:58 INF [HLS] listener opened on :8888
2023/09/22 12:34:58 INF [WebRTC] listener opened on :8889 (HTTP)
[0:26:13.822982709] [1457]  INFO Camera camera_manager.cpp:299 libcamera v0.0.4+22-923f5d70
[0:26:13.887593667] [1458]  INFO RPI raspberrypi.cpp:1476 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media2 and ISP device /dev/media0
[0:26:13.889176990] [1457]  INFO Camera camera.cpp:1028 configuring streams: (0) 1920x1080-YUV420
[0:26:13.889745371] [1458]  INFO RPI raspberrypi.cpp:851 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 1920x1080-SGBRG10_1X10 - Selected unicam format: 1920x1080-pGAA
2023/09/22 12:34:59 INF [path cam] [rpicamera source] ready: 1 track (H264)

La transmisión de la cámara de la RaspberryPI estará disponible en la ruta http://hostname:8889/cam/. Comprueba que puedes acceder a la cámara. Por ejemplo: http://pi3:8889/cam/

Paso 3: Integración con Sinric Pro.

Sinric Pro create device alexa

Sinric Pro webrtc camera

Selecciona RaspPi or Other y elige WebRTC como protocolo

Sinric Pro copy device id

Paso 4: Programación

Puedes usar el SDK de Python o el de NodeJS para gestionar las solicitudes de oferta/respuesta SDP entre Alexa/Google Home y MediaMTX.

Instala nuestro PythonSDK: pip install sinricpro --user

from sinric import SinricPro, SinricProConstants
import requests
import asyncio
import base64

APP_KEY = ""
APP_SECRET = ""
CAMERA_ID = ''

def get_webrtc_answer(device_id, offer):
    sdp_offer = base64.b64decode(offer)
    print('device_id: {} offer: {}'.format(device_id, offer))

    # PORT 8889 for WebRTC. eg: for PiCam, use http://<mediamtx-hostname>:8889/cam/whep
    mediamtx_url = "http://<mediamtx-hostname>:8889/cam/whep"  #TODO: Change <mediamtx-hostname> 
    headers = {"Content-Type": "application/sdp"}
    response = requests.post(mediamtx_url, headers=headers, data=sdp_offer)

    if response.status_code == 201:
        answer = base64.b64encode(response.content).decode("utf-8")
        return True, answer
    else:
        return False


def power_state(device_id, state):
    print('device_id: {} power state: {}'.format(device_id, state))
    return True, state

callbacks = {
    SinricProConstants.GET_WEBRTC_ANSWER: get_webrtc_answer,
    SinricProConstants.SET_POWER_STATE: power_state
}

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    client = SinricPro(APP_KEY, [CAMERA_ID], callbacks,
                       enable_log=False, restore_states=False, secret_key=APP_SECRET)
    loop.run_until_complete(client.connect())

Ver este código en GitHub Gist

Instala nuestro SDK de NodeJS: npm install sinricpro

const {
  SinricPro, startSinricPro, raiseEvent, eventNames,
} = require('sinricpro');

const fetch = require('node-fetch');

const APPKEY =  "";
const APPSECRET = "";
const cameraId = "";
const deviceIds = [cameraId];

async function mediamtx(offer) {
  /* 
    Get the answer from mediamtx `http://<hostname>:8889/<name>/whep`. eg: http://pi3:8889/cam/whep
  */
  const url = "http://<mediamtx-hostname>:8889/cam/whep";  // TODO: Change <mediamtx-hostname>.
  const response = await fetch(url, {
    headers: {
      "content-type": "application/sdp",
    },
    body: offer,
    method: "POST",
  });

  // eslint-disable-next-line no-return-await
  return await response.text();   
}

const getWebRTCAnswer = async (deviceid, base64Offer) => {
  // Alexa Eco needs camera stream answer
  const offer = Buffer.from(base64Offer, 'base64').toString();
  try {
    const answer = await mediamtx(offer);
    const answerInBase64 = Buffer.from(answer).toString('base64');
    return { success: true, answer: answerInBase64 };
  } catch (error) {
    console.error(error);
    return { success: false };
  }  
};

const setPowerState = async (deviceid, data) => {
  console.log(deviceid, data);
  return true;
};

const sinricpro = new SinricPro(APPKEY, deviceIds, APPSECRET, false);
const callbacks = { setPowerState, getWebRTCAnswer };

startSinricPro(sinricpro, callbacks);

Ver este código en GitHub Gist

Paso 5: Demostración

  1. Pide a Alexa o a Google Home que busque dispositivos nuevos.
  2. Alexa: Alexa, muéstrame Font Camera
  3. Google Home: Muéstrame Font Camera en Working Room TV (el nombre de tu Chromecast con Google TV)

Alexa Show Echo:

Portal:

Google Home Chromecast con Google TV:

Sinric Pro WebRTC Camera Google Home Chromecast with Google TV

App Alexa:

Sinric Pro WebRTC camera with Alexa app

App Sinric Pro:

Solución de problemas

  1. La vista previa de cámara de la beta pública de la app Google Home no funciona correctamente.

  2. Por ahora, WebRTC de Google Home es compatible con las pantallas inteligentes Google Nest y los dispositivos Chromecast con Google TV.

  3. Puedes usar la herramienta WebRTC de Google para validar el payload. https://smarthome-webrtc-validator.withgoogle.com/

  4. ¿La cámara no funciona?

Comprueba que está bien conectada.

Sinric Pro Pi camera how to connect

Consulta nuestra página de Solución de problemas para ver posibles soluciones a tu problema.

Tutoriales relacionados

Este documento es de código abierto. ¿Has visto una errata? Crea una issue