Appareil/entités "virtuelles" pour volets controllés par script + Homekit

Bonjour à tous !

Je sollicite votre expertise car je rencontre actuellement quelques difficultés !

Je suis en train d’essayer de migrer de Jeedom vers Home Assistant depuis quelques semaines.

Je dispose d’un boitier Airsend ce qui me permet piloter mes volets « propriétaires » ayant un Rolling Code (donc impossible via Rfxcom classique). Contrairement à Jeedom, il n’existe pas d’intégration officielle sur HA : donc impossible d’avoir automatiquement des appareils avec leurs entités.

Du coup, afin d’ouvrir/fermer mes volets, je dois soit faire appel à un script, soit appeler l’api (via un lien/url).

Je suis encore un peu bloqué dans la logique Jeedom étant donné que je débute. Sur Jeedom, j’aurais créé l’équivalent d’un objet virtuel, sur lequel j’aurai 4 éléments :

  • Un statut permettant de dire si le volet est ouvert ou fermé
  • Une commande « monter »
  • Une commande « descendre »
  • Une commande « stop »

Après de nombreuses recherches, j’ai l’impression que ce n’est pas possible de procéder ainsi sur HA et je voudrais donc savoir quelle serait la méthode la plus propre.

L’objectif serait :

  • Au mieux d’avoir un appareil avec des entités (impossible facilement ?)
  • D’avoir sur le tableau de bord une tuile avec l’état d’ouverture du volet et les commandes
  • De pouvoir avoir aussi sur l’application Home d’Apple (via Homekit), un objet par volet avec l’état et les commandes d’ouvertures

Pour le moment, j’ai juste tenté d’ouvrir un volet via un script qui appelle un « shell_command » :

La commande shell permettant d’appeler un URL de l’API :

shell_command:
  airsend_shutter: "curl -fsS -m 10 --retry 5 -o /dev/null {{ url }}"

Le script permettant d’ouvrir un volet en particulier (j’utilise une variable pour stocker l’état) :

test_volet:
  alias: test volet
  sequence:
    - service: shell_command.airsend_shutter
      data:
        url: !secret airsend_bureau_up
    - service: var.set
      data:
        entity_id: var.airsend_bureau
        value: 1
        icon: mdi:window-shutter-open

La variable d’état d’ouverture du volet :

var:
  airsend_bureau:
    friendly_name: 'Etat'
    initial_value: 0
    icon: mdi:window-shutter

Je ne sais pas si c’est une bonne piste, ça me parait un peu « usine à gaz » ! De plus, j’ai l’impression que les différentes commandes et l’état ne sont pas « liées entre elles » comme pourraient l’être les entités d’un appareil : je m’interroge donc sur la faisabilité pour la partie Homekit.

Merci d’avance pour vos éclaircissements !

Tu peux très bien le faire sur HA :

La notion de facilité va dependre de la personne…

Cependant, avec un modèle (template), c’est faisable assez rapidement (subjectif aussi :wink:) :
Pour les commandes, ouverture, fermeture et stop utilise ce que tu as fait avec les commandes et les scripts.

Pour la positon, sois tu laisse HA se débrouiller, soit tu le règle toi même.

N’hésite pas si tu as des questions :+1:

Merci pour ta réponse. En effet, ça m’a l’air pas trop mal « Template cover » :slight_smile:

Quand tu parles de « modèle », tu parles du Template Cover ou d’autre chose ?

Je disais « facilement », car ce qui j’ai mis en place avec les scripts & co, j’avais l’impression de partir dans un truc complètement délirant (comparé à mes habitudes sur Jeedom), du coup je me demandais si j’étais pas passé à coté d’une fonctionnalité, vu que je manque encore de recul sur HA. Après si y’a d’autres solutions plus propres, même si c’est plus compliqué je veux bien que tu me dises, ça me fait pas peur: la programmation c’est mon métier ! :smiley: Je me suis même amusé hier soir à débugger l’intégration Jeedom de mes volets afin de voir si je pouvais pas utiliser directement le programme fourni dans le package pour communiquer avec le boîtier (en local) plutôt que de passer par l’API (via internet)

Par contre, passer par un template cover me permettra d’avoir une interface propre sur HA, mais qu’en est il avec HomeKit ? Il y a moyen d’obtenir une tuile comme ça ? J’ai cru comprendre que seuls les appareils/entités étaient envoyées sur Homekit?

Merci !

Oui du template cover (j’essaie au maximum de franciser mes écrits et les mots en parenthèses sont les termes anglais utiles pour les recherches internet)

Bein vu que la documentation te donne comme exemple l’utilisation de scripts… autant partir dessus.

Passer par un API ne signifie pas forcément de passer par internet.

Aucune idée j’utilise pas.

Une fois le modèle de ton volet (template cover) réalisé et remonté dans HA, ce sera une entité. Donc en théorie, tu pourras la pousser vers Home Kit.
:warning: La position du volet dépends entièrement de la définition de la valeur dans ton modèle (value_template).

Tiens nous au courant

Bonjour,

Je voulais savoir si votre projet avait abouti.
Je suis en train d’essayer d’automatiser mes volets avec HomeAssistant et Airsend, mais je galère un peu.
J’ai récupérer les commande CURL via le site de airsend, mais j’ai l’impression qu’il ne garde pas la session ouverte après le login initial. Je recois bien un id de session, mais à la commande suivante j’ai une erreur 401.

Une idée de ce qui coince?

Merci,

Emmanuel

Bonjour,

Oui j’avais bien réussi à faire fonctionner. J’ai mis un peu en pause ma migration vers HASS, donc je ne suis plus certain à 100%, mais voila ce qu’il faut faire dans mes souvenirs.

Prérequis : avoir les différents volets intégrés dans airsend.cloud

Aller sur : https://airsend.cloud/device : cela va lister les différents objets présents et permettre de récupérer certaines données indispensables pour piloter les volets:

image

Niveau paramétrage :

configuration.yaml

shell_command:
  airsend_shutter: "curl -fsS -m 10 --retry 5 -o /dev/null https://airsend.cloud/device/{{ device }}/command/{{ action }}/?session={{ session}}"

cover:
  - platform: template
    covers:
      shutter_bureau:
        unique_id: cover_bureau
        optimistic: true
        device_class: shutter
        friendly_name: "Volets Bureau"
#        value_template: "{{is_state('var.airsend_bureau', 'open')}}"
        value_template: "{{is_state('sensor.shutter_bureau', 'open')}}"
        open_cover:
          service: script.airsend_shutter_bureau_up
        close_cover:
          service: script.airsend_shutter_bureau_down
        stop_cover:
          service: script.airsend_shutter_bureau_stop
        icon_template: >-
          {% if is_state('var.airsend_bureau', 'open') %}
            mdi:window-shutter-open
          {% else %}
            mdi:window-shutter
          {% endif %}
      shutter_chambre:
        unique_id: cover_chambre
        optimistic: true
        device_class: shutter
        friendly_name: "Volets Chambre"
      #        value_template: "{{is_state('var.airsend_chambre', 'open')}}"
        value_template: "{{is_state('sensor.shutter_chambre', 'open')}}"
        open_cover:
          service: script.airsend_shutter_chambre_up
        close_cover:
          service: script.airsend_shutter_chambre_down
        stop_cover:
          service: script.airsend_shutter_chambre_stop
        icon_template: >-
          {% if is_state('var.airsend_chambre', 'open') %}
            mdi:window-shutter-open
          {% else %}
            mdi:window-shutter
          {% endif %}

var:
  airsend_bureau:
    friendly_name: 'Etat'
    initial_value: open
    icon: mdi:window-shutter
  airsend_chambre:
    friendly_name: 'Etat'
    initial_value: open
    icon: mdi:window-shutter
  • airsend_shutter dans shell_command contient la commande générique à envoyer à airsend.
  • La partie cover est pour l’affichage des volets (boutons + état). Lors du clic sur « ouvrir »/« descendre », cela va actionner un script du code ci-dessous

scripts.yaml

# Bureau
airsend_shutter_bureau_up:
  alias: "Bureau up"
  sequence:
    - service: shell_command.airsend_shutter
      data:
        session: !secret session_airsend
        device: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
        action: zzzzzzzzzzzzzzzzzzzzzzzzz
    - service: var.set
      data:
        entity_id: var.airsend_bureau
        value: open
        icon: mdi:window-shutter-open

airsend_shutter_bureau_down:
  alias: "Bureau down"
  sequence:
    - service: shell_command.airsend_shutter
      data:
        session: !secret session_airsend
        device: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
        action: zzzzzzzzzzzzzzzzzzzzzzzzz
    - service: var.set
      data:
        entity_id: var.airsend_bureau
        value: closed
        icon: mdi:window-shutter

airsend_shutter_bureau_stop:
  alias: "Bureau stop"
  sequence:
    - service: shell_command.airsend_shutter
      data:
        session: !secret session_airsend
        device: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
        action: zzzzzzzzzzzzzzzzzzzzzzzzz
# Chambre

airsend_shutter_chambre_up:
  alias: "Chambre up"
  sequence:
    - service: shell_command.airsend_shutter
      data:
        session: !secret session_airsend
        device: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
        action: zzzzzzzzzzzzzzzzzzzzzzzzz
    - service: var.set
      data:
        entity_id: var.airsend_chambre
        value: open
        icon: mdi:window-shutter-open

airsend_shutter_chambre_down:
  alias: "Chambre down"
  sequence:
    - service: shell_command.airsend_shutter
      data:
        session: !secret session_airsend
        device: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
        action: zzzzzzzzzzzzzzzzzzzzzzzzz
    - service: var.set
      data:
        entity_id: var.airsend_chambre
        value: closed
        icon: mdi:window-shutter

airsend_shutter_chambre_stop:
  alias: "Chambre stop"
  sequence:
    - service: shell_command.airsend_shutter
      data:
        session: !secret session_airsend
        device: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
        action: zzzzzzzzzzzzzzzzzzzzzzzzz

Il faut alimenter les données suivantes avec les infos récupérées dans le lien donné plus haut :

  • device : correspond à la donnée « id » (si cela ne fonctionne pas, essayer avec « addr »)
  • action : 0:OFF ; 1:ON ; 2:PROG ; 3:STOP ; 4:DOWN ; 5:UP ; 6:TOGGLE (on utilisera ici 4 (down) ou 5 (up) ou 3 (stop) pour des volets. A noter que 0 (off) et 1 (on) fonctionnent aussi)

Enfin, j’ai enregistré l’id de la session dans secrets.yaml

session_airsend: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Par contre, je ne suis plus certain de comment j’avais fait pour le récupérer… Peut être aller sur la page de l’API (AirSend.cloud), cliquer sur « Try it out », renseigner le login/password et cliquer sur « Execute »
Si cela fonctionne bien, on doit retrouver un peu plus bas un objet json comme ceci :

En espérant que cela puisse aider :slight_smile:

Bonjour à tous,
Cela fait vraiment « usine à gaz » effectivement. J’avais essayé mais trop compliqué à mettre en place. Heureusement il y a maintenant un plugin « officiel » sur le repo devmel de github, pas si simple à installer mais en suivant bien ça fonctionne.

J’espère qu’il sera amélioré sans cloud.
Bonne journée