Gestion de présence avec Shelly BLU Button1 et BTHome

Bonjour !

Mon problème

Je débute avec HA et j’essaie d’utiliser un Shelly BLU Button1 pour gérer une présence.
Avec l’application Shelly Debug (sous iOS), j’ai mis à jour le firmware du bouton et activé la fonction Beacon

Le bouton est bien reconnu par BTHome


Trois paramètres sont remontés :

  • Battery
  • Packet id
  • Signal Strength

Je constate qu’il n’existe pas de notion de « présence » ou « absence »

En ayant mis le bouton dans un micro-onde pour couper le signal BT, je constate ceci dans le suivi des paramètres Packet id et Signal Strength


On obtient un « plateau » avec la dernière valeur enregistrée

J’ai regardé les automatisations mais je ne vois pas comment déduire que le bouton est hors champs avec la valeur Packet id qui est restée statique

Merci de me mettre sur la voie !

Ma configuration


[center]## System Information

version core-2023.6.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.4
os_name Linux
os_version 6.1.34
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 10.3
update_channel stable
supervisor_version supervisor-2023.06.2
agent_version 1.5.1
docker_version 23.0.6
disk_total 117.4 GB
disk_used 3.3 GB
healthy true
supported true
board generic-aarch64
supervisor_api ok
version_api ok
installed_addons
Dashboards
dashboards 1
resources 0
views 1
mode storage
Recorder
oldest_recorder_run 26 juin 2023 à 09:54
current_recorder_run 26 juin 2023 à 13:19
estimated_db_size 8.03 MiB
database_engine sqlite
database_version 3.41.2
[/center]

Par curiosité j’en ai acheté un et regardé. Déjà il bouffe les piles en 3 jours, donc pour la présence on va oublier. Il vaut mieux utiliser un Tile ou Nut qui sont fait pour…

Bonjour

Après 40 heures d"utilisation, je ne constate pas d’effondrement de la batterie selon le panneau de suivi batterie (version de firmware, peut-être ?)

image

J’ai démarré avec un relevé de 86% environ et je suis sensiblement au même niveau 40 heures après

Pour en revenir à ma question, j’ai poursuivi ma recherche.

Il faut utiliser l’entité « Packet id » pour déterminer « présence » ou « absence »
J’ai regardé de plus près le « plateau » dans l’historique de cette entité lorsque le Shelly BLU Button1 est hors de portée. En fait, le trait horizontal « ne devrait pas exister », puisqu’il n’y a aucune remontée durant la période.

Il me semble que je dois mettre en place une routine qui va récupérer toutes les 30 secondes la date et heure de la dernière remontée d’info de cette entité et la comparer avec l’heure de la routine.
Si l’intervalle est supérieur à 30 secondes => absence

Je vais regarder les tutoriels du forum et chercher s’il existe une fonction donnant la durée en secondes depuis le dernier changement de valeur

Bonjour

J’ai avancé dans mes recherches et je me suis appuyé sur une « automatisation ».

J’ai découvert :

  • Qu’il fallait installer le module complémentaire « File editor » pour avoir plus de possibilités de configuration (pour modifier en direct le fichier « automations.yaml »)
  • Qu’un rechargement de la configuration « automatisations » était nécessaire après modification (via « outils de développement » « YAML »)
  • Apparemment, il n’existe pas de fonction qui retourne la durée en secondes depuis le dernier changement de valeur d’une entité

Voici donc le fichier « automations.yaml » qui me permet de savoir si le Shelly BLU Button1 est hors de portée :

- id: '1688054147393'
  alias: Suivi présence
  description: Bouton Shelly injoignable
  trigger:
  - platform: time_pattern
    seconds: '30'
  condition:
  - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated))
    > 30 }}'
  action:
  - service: logbook.log
    data:
      name: Etat absent
      message: ' Absent '
  mode: single

Il me reste à traiter le « retour » après « absence ».
Je pensais utiliser une « variable », mais lors de ma lecture de ce forum, j’ai pu lire que l’on ne parlait pas de « variable » avec HA ?
Je dois aussi trouver si l’on peut utiliser une double condition dans l’automatisation ?

Bonjour

Cette fois, je craque !

J’ai lu qu’il fallait utiliser « choose » au lieu de if/else
J’ai donc essayé ceci :

- id: '1688133142269'
  alias: Bouton Shelly JJ
  description: Suivi Bouton Shelly JJ
  trigger:
  - platform: time_pattern
    seconds: '30'
  condition: []
  action:
    - choose:
        - conditions:
            - condition:
                - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated)) > 30 }}'
              and:
            - condition:
                - ' {{ presence = 1 }} '
          sequence:
            - service: logbook.log
              data:
                name: Etat absent
                message: ' Absent '
            - variables:
                 presence: 0
        - conditions:
            - condition:
                - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated)) < 30 }}'
              and:
            - condition:
                - ' {{ presence = 0 }} '
          sequence:
            - service: logbook.log
              data:
                name: Etat present
                message: ' Présent '
            - variables:
                 presence: 1
  mode: single

Et en retournant sur « paramètres » « automatisation » l’automatisation a disparu : « Aucune automatisation n’a été trouvée » !

J’ai vraiment besoin d’une aide… merci d’avance !

J’ai exclu certaines lignes en les commentant et j’ai retrouvé l’automatisation !

- id: '1688133142269'
  alias: Bouton Shelly JJ
  description: Suivi Bouton Shelly JJ
  trigger:
  - platform: time_pattern
    seconds: '30'
  condition: []
  action:
    - choose:
        - conditions:
            - condition:
                - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated)) > 30 }}'
##              and:
##            - condition:
##                - ' {{ presence = 1 }} '
          sequence:
            - service: logbook.log
              data:
                name: Etat absent
                message: ' Absent '
            - variables:
                 presence: 0
        - conditions:
            - condition:
                - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated)) < 30 }}'
##              and:
##            - condition:
##                - ' {{ presence = 0 }} '
          sequence:
            - service: logbook.log
              data:
                name: Etat present
                message: ' Présent '
            - variables:
                 presence: 1
  mode: single

Mais une petite aide est toujours la bienvenue
Merci !

Après la mise à jour ça semble bien mieux !

1 « J'aime »

Quand on passe le mode Beacon à ON (pour faire ce que tu veux faire), régulièrement le bouton est sollicité. Ce qui fait que si tu y colle une lampe ça fait du yoyo… Pour autant ca ne remonte pas dans les Beacons de HA…Mais ça c’est un autre mystère…

J’ai choisi d’utiliser le bouton comme détecteur de présence (je sais qu’il y a d’autres solutions)
C’est pourquoi j’ai activé le mode Beacon et je n’utiliserai pas le bouton du bouton :grinning:

Comme je l’ai indiqué, le bouton est bien reconnu par BTHome (et pas dans iBeacon Tracker)

Nouvelle étape !

J’ai supprimé les variables : si j’ai bien compris (après de longues lectures de forums), une variable est locale lorsqu’elle est initialisée dans « sequence »… et on ne peut pas connaître sa valeur via l’interface HA
J’ai donc créé un « input-number » (paramètres - appareils et services - entrées)

L’automatisation fonctionne et me permet de gérer présence/absence.
Il me reste à la mettre en œuvre
Ci-après le fichier automations.yaml

- id: '1688133142269'
  alias: Bouton Shelly JJ
  description: Suivi Bouton Shelly JJ
  trigger:
  - platform: time_pattern
    seconds: '30'
  condition: []
  action:
  - choose:
    - conditions:
      - condition:
        - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated))
          > 30 }}'
      - condition: numeric_state
        entity_id: input_number.presence_jj
        above: 0
      sequence:
      - service: logbook.log
        data:
          name: Etat absent
          message: ' Absent '
      - service: input_number.set_value
        data:
          value: 0
        target:
          entity_id: input_number.presence_jj
    - conditions:
      - condition:
        - ' {{ ( as_timestamp( now()) - as_timestamp( states.sensor.shelly_blu_button1_b4b9_packet_id.last_updated))
          < 30 }}'
      - condition: numeric_state
        entity_id: input_number.presence_jj
        below: 1
      sequence:
      - service: logbook.log
        data:
          name: Etat present
          message: ' Présent '
      - service: input_number.set_value
        data:
          value: 1
        target:
          entity_id: input_number.presence_jj
  mode: single

J’utilise « above » et « below », alors qu’un test d’égalité serait plus logique… mais je n’ai pas trouvé comment faire…
Peut-être aurai-je un retour ? :wink: