Baby phone, smartphone android, ipwebcam

Mon problème

Lire un stream wav disponible en local sur l’application « home assistant compagnon »

Ipwebcam, installé sur un smartphone android, partage un flux audio en local via http(s)://IPLOCAL:8080/audio.wav
J’aimerai réussir à lire ce flux directement dans lovelace (et via l’app mobil compagnon) et a l’extérieur du réseaux local,… Est ce possible ?

Il « suffit » d’essayer de la rajouter comme camera dans HA, de rajouter la carte camera dans lovelace et de voir si ça marche…
Après, l’accès extérieur, ça n’a rien à voir avec la caméra spécifiquement. Donc, mettre en place un accès externe (rechercher sur le forum les diverses options) et c’est bon, si l’accès en local marche, bien entendu.

Tu veux dire ajouter le stream audio.wav en temps que caméra ?

Oups… Je n’avais pas vu audio seulement. Désolé.
J’ai donc dit une bêtise.
Une recherche sur le forum anglais ne donne rien de bien concret. Il faut sans doute utiliser ffmpeg, mais, j’ai bien l’impression qu’il n’y a rien de simple…

J’ai toujours moyen de rendre le flux accessible via nat/pat avec ma box et d’utiliser un card browser. Mais impossible d’avoir un certificat ssl pour le flux…

Est ce que vous pensez qu’ils serait possible de faire fonctionner ce genre d’app avec home assistant en utilisant rtsp ?

J’ai réussi a avoir image et son avec cette application et 'integration d’une « generic camera » RTSP :
Il est possible de contrôler cette application via des requêtes GET,… par exemple :
http://ADRESSEIP:PORT/camswitch
/toggle_motion (déclenche l’enregistrement a la détection d’un mouvement)
/light
/getarchives (list html des archives et de leur url,…)
/serverinfo (client connecté, batterie, en charge)
Avec une rest_command dans configuration.yaml :

rest_command:
  switch_side_cam:
    url: "http://ADRESSEIP:PORT/camswitch"
    method: GET
    username: xxxx
    password: xxxx
    content_type: text/plain

Possibilité de sauvegarder les vidéos sur un ftp distant de son choix.
Un défault : l’application stop le stream quand elle fonctionne en arrière plan en dessous d’android 8.

Mais j’ai finalement choisi

Qui permet d’avoir les flux des deux camera en même temps (meme si j’ai pas encore reussi)

Et j’ai bien la vidéos et le son dispo via homeassistant en dehors du réseau local.

J’ai finalement testé une autre application :

Qui permet des sauvegarde sur google.drive.
Qui possède un API bien complète et détaillé, pour controller la cam :
Zoom, switch front/back, light/focus, quelque sensors etc,…
Le motion detect permet d’appeler une URL ( et donc de déclencher ce que l’on veut avec L’API home assistant)

http://ADRESSIP:PORT/control?zoom=-20&camera=1

Elle fonctionne en background sur un android 5 et se relance au reboot du téléphone

Voici le résultat :

Afin de déclencher quelque chose quand le motion detect est true, j’aimerais exploité cette requête qui fourni cette structure json :

{
    "motion_events": [
        {
            "state": true,
            "timestamp": 1654344758668
        },
        {
            "state": false,
            "timestamp": 1654344764185
        },
        {
            "state": true,
            "timestamp": 1654344812976
        },
        {
            "state": false,
            "timestamp": 1654344818238
        },
        {
            "state": true,
            "timestamp": 1654344821666
        },
        {
            "state": false,
            "timestamp": 1654344826923
        },
        {
            "state": true,
            "timestamp": 1654344844526
        },
        {
            "state": false,
            "timestamp": 1654344849649
        },
        {
            "state": true,
            "timestamp": 1654344856274
        },
        {
            "state": false,
            "timestamp": 1654344865939
        }
    ]
}

Quelqu’un pourrais me guider de comment déclarer mon sensor.rest/ ?
De quel manière ce sensor ce met a jour ?

Pour le moment je récupère le contenu de mon jsan dans les attributs de mon entité, ok :

  - platform: rest 
    name: camsl motion detection
    resource: http://ip.ip.ip.ip:PORT/motion
    method: GET
    username: login
    password: !secret camsl_pswd
    scan_interval: 15
    json_attributes:
      - motion_events
    value_template: "OK"

L’objectif serait que l’état de l’entité prenne directement la dernière valeur de state je pense ,…

Il faudrait avoir le JSON complet qui est envoyé par la requête rest pour voir comment extraire ce que tu veux.
C’est expliqué là RESTful Sensor - Home Assistant

Comme c’est un sensor rest, par défaut, il y aura une requête envoyée toutes les 5 minutes. Ca peut se changer avec:

scan_interval: 60

En seconde…

Mais, si effectivement l’outil utilisé sait appeler une URL (la documentation de l’outil est très -trop- légère), il vaut mieux passer par ça pour être averti quand un évènement se produit et éviter le polling.
Ca s’appelle un webhook: Automation Trigger - Home Assistant

Le souci avec les webhook de HA, c’est qu’ils ne supportent pas les GET. Or, souvent, les trucs qui savent faire une requête HTTP sur une évènement font un GET. Et dans ce cas, c’est cuit. NodeRed sait faire un « webhook » en GET.

Oups désolé, j’ai éditer avec le JSON complet au dessus, je peux également faire la requête en post mais dans un premier temps je cherche a séparer les données afin d’avoir une entité avec un état true/false

Vu que, si je comprends bien, c’est le dernier « state » de la liste qui est intéressant, je pense que ça doit être avec un truc comme ça:

- platform: rest 
    name: camsl motion detection
    resource: http://ip.ip.ip.ip:PORT/motion
    method: GET
    username: login
    password: !secret camsl_pswd
    scan_interval: 15
    value_template: >-
        {% for events in value_json.motion_events %}
              {%- if loop.last %} {{ events.state }} {% endif -%}
        {% endfor %}

Mais, je ne garantis rien. Le jinja2 et moi, on n’est pas pote…

Dans le mille ! Merci ! Et une dernière question j’ai du mal a trouver comment afficher correctement un timestamp par exemple dans les attributs,

 json_attributes:
      - as_datetime(motion_events[9].timestamp)

On s’aventure en terre inconnue pour moi… Je pense qu’il faut faire un truc en deux coups comme expliqué ici RESTful Sensor - Home Assistant

- platform: rest 
    name: camsl_motion_detection
    resource: http://ip.ip.ip.ip:PORT/motion
    method: GET
    username: login
    password: !secret camsl_pswd
    json_attributes:
      - state
      - timestamp
    scan_interval: 15
    value_template: >-
        {% for events in value_json.motion_events %}
              {%- if loop.last %} {{ events }} {% endif -%}
        {% endfor %}
  - platform: template
    sensors:
      motion_detection_state:
        value_template: "{{ state_attr('sensor.camsl_motion_detection', 'state') }}"
      motion_detection_time:
        value_template: "{{ state_attr('sensor.camsl_motion_detection', 'timestamp') }}"

Mais, bon, le premier exemple c’était déjà du bol que ce soit ça. Là, je n’ose pas imaginer!