Récupérer les dimmers zwave de jeedom dans HA

Bonjour,

Dans le cadre de ma migration, je souhaite (du moins pour le moment), continuer à utiliser jeedom en même temps que je prépare mon HA, dans ce contexte je cherche à mettre en place un pont entre les deux.

J’ai lu plusieurs sujets sur la question (par exemple celui-ci: Création d'un pont Jeedom vers HA), mais je n’arrive pas encore à mes fins.

Pour ce qui est de la récupération d’infos (exemple une température), pas de problèmes, je passe par l’API jeedom, en déclarant mes entités coté HA, par exemple:

sensor temp_parents:
  - platform: rest
    resource: https://mondomaine.com/core/api/jeeApi.php?apikey=maclétype=cmd&id=macommande
    name: "Temp. parents"

Mais la ou je n’y arrive pas, c’est pour les commandes (genre on, off, réglage de l’intensité, ou encore positionnement d’un volet roulant).

Est-ce que quelqu’un aurais un exemple concret (bouton et slider) de comment les déclarer coté HA comme je peux le faire pour la récupération d’infos via l’API?

Ps: J’ai regardé aussi un peu en utilisant jmqtt (que je découvre), mais je n’ai pas abouti non plus.

Merci d’avance.

Dans le lien que tu indiques, je montre une méthode qui s’appuie sur nodered et l’url de commande global de jeedom.
Pour pratiquer le yaml (qui n’est pas ma tasse de thé…) j’ai essayé de faire sans :slight_smile:
Voilà ce que j’obtiens.

Dans configuration.yaml :

light:
  - platform: template
    lights:
      cuisine:
        friendly_name: "Lumière Cuisine"
        level_template: "{{ ((states('sensor.kitchen_brightness')|int) * 255 / 100)|int }}"
        value_template: "{{ states('sensor.kitchen_brightness')|int >0 }}"
        turn_on:
          service: script.turn_on_kitchen
        turn_off:
          service: script.turn_off_kitchen
        set_level:
          service: script.set_brightness_kitchen
          data:
            brightness: " {{ brightness - 1 }}"

sensor:
  - platform: rest
    resource: http://IP_JEEDOM/core/api/jeeApi.php?apikey=token&type=cmd&id=496
    name: kitchen_brightness

input_text:
    jeedroid_api_cmd:
      initial: 'http://IP_JEEDOM/core/api/jeeApi.php?apikey=token&type=cmd&id='
      max: 128

shell_command:
  cuisine_brightness: 'curl {{ states("input_text.jeedroid_api_cmd") }}493&slider={{brightness}}'
  cuisine_on: 'curl {{ states("input_text.jeedroid_api_cmd") }}494'
  cuisine_off: 'curl {{ states("input_text.jeedroid_api_cmd") }}495'

493, 494, 495 et 496 sont les id des actions dans jeedom.
Le input_text a pour simple but de « factoriser » l’utilisation de cet appel dans les shell_command.
Il semble que l’on ne puisse pas faire pareil dans le sensor rest. J’ai donc répété.

L’opération dans level_template est pour recaler sur 100 et pas 255, je ne sais pas pourquoi…

Ensuite dans scripts.yaml (peut être créer via l’interface):

turn_on_kitchen:
  alias: turn_on_kitchen
  sequence:
  - service: shell_command.cuisine_on
    data: {}
  - delay: '3'
  - service: homeassistant.update_entity
    data: {}
    entity_id: sensor.kitchen_brightness
  mode: single
turn_off_kitchen:
  alias: turn_off_kitchen
  sequence:
  - service: shell_command.cuisine_off
    data: {}
  - delay: '3'
  - service: homeassistant.update_entity
    data: {}
    entity_id: sensor.kitchen_brightness
  mode: single
set_brightness_kitchen:
  alias: set_brightness_kitchen
  sequence:
  - service: shell_command.cuisine_brightness
    data:
      brightness: ' {{ (brightness / 255 * 100) | int }}'
  - delay: '3'
  - service: homeassistant.update_entity
    data: {}
    entity_id: sensor.kitchen_brightness
  mode: single

L’astuce à chaque fois, c’est de lancer la commande shell vers jeedom (le curl…), d’attendre un peu que ça soit traité et de forcer la mise à jour du sensor rest. Comme ça, tu as le retour d’état avant la mise à jour par défaut (toutes les 30s je crois).

Avec ça, dans lovelace tu as une carte light avec un slider:

Screenshot 2021-01-30 at 17.31.09

Pour un switch simple, garder la même logique en ne gardant que turn_on et off.

Si un expert yamliste passe par là (pour ne pas le nommer @Clemalex), il pourra sans doute améliorer ça. Mais, en l’état ça marche :wink:

2 J'aime

L’important est que ça marche… :+1: et je n’ai rien remarqué d’ahurissant :wink:

Juste, le script.refresh… :roll_eyes: :expressionless: :slightly_smiling_face: ok, tu as édité :sweat_smile: :smile:

Merci :slight_smile:

Mais, tu vois, j’ai quand même galéré pour debugger ça.
Par exemple, le brightness qui pour une raison que j’ignore est de 0 à 100 dans le slider (aussi bien dans lovelace que jeedom) mais qui se retrouve dans certains cas sur 255.
Pour trouver pourquoi pour les luminosités les plus fortes, ça ne marchait pas, j’ai mis ça:

logger:
  default: info
  logs:
     homeassistant.components.shell_command: debug

Donc, je voyais bien dans les logs les appels à curl, mais, pas la valeur réelle de la luminosité. Juste {{ brightness }}. Argh.

Il a fallu que je fasse un tcpdump pour voir la syntaxe exacte de ce qui curl appelle.

Le log de HA donnerait la commande exacte et pas l’output de curl, ce serait quand même plus pratique.

C’est quoi la méthode alors?

Ça je comprends pas… :thinking:

Dans le level_template… La commande curl renvoie la valeur ( X) entre 0 et 100. Et le level_template se retrouve avec ( X / 2.55 ).
D’ou la multiplication dans la template pour retrouver la « bonne » valeur.
Et je suis obligé de faire l’inverse dans le script. :stuck_out_tongue_winking_eye:

C’est juste un exemple, mais, comment tu debugges ce genre de truc? Là, vu que c’était un appel réseau, j’ai sorti l’artillerie lourde avec tcpdump. Mais quand c’est dans les tripailles de HA, comment on fait?

Et oui, l’un parle en pourcentage et l’autre en nombre de point… :innocent:

Je pense que c’est quelque chose à garder en mémoire et à demander pendant le mois « What’s the heck »

Et pour le debug? Une méthode à proposer? C’est en fait ce que je trouve difficile avec les scripts/automatisations natives. Comment debugger quand ça ne marche pas…

Tout le debug se fait dans Outils de développement → Onglet MODELE

Un grand merci @golfvert !

Ca marche niquel, j’ai juste fait quelques ajustements:

delay: « 3 » ==> delay: « 1 »
==> Comme ça le retour d’état parait plus « naturel »

brightness: " {{ brightness -1 }}" ==> brightness: " {{ brightness }}"
==> Cela provoquai un décalage de 1 lors de la mise à jour de la valeur.

J’ai également fait le test pour un volet roulant, voici le code si jamais j’ai fait une bétise et/ou si ça intéresse d’autres lecteurs par la suite.

Coté configuration.yaml:

cover:
  - platform: template
    covers:
      bureau:
        device_class: shutter
        friendly_name: "Bureau"
        position_template: "{{ states('sensor.bureau_position')}}"
        open_cover:
          service: script.up_bureau
        close_cover:
          service: script.down_bureau
        stop_cover:
          service: script.stop_bureau
        set_cover_position:
          service: script.set_position_bureau
          data:
            position: " {{ position }}"

shell_command:
  bureau_position: 'curl {{ states("input_text.jeedroid_api_cmd") }}776&slider={{position}}'
  bureau_up: 'curl {{ states("input_text.jeedroid_api_cmd") }}773'
  bureau_stop: 'curl {{ states("input_text.jeedroid_api_cmd") }}780'
  bureau_down: 'curl {{ states("input_text.jeedroid_api_cmd") }}774'

sensor:
  - platform: rest
    resource: http://IP_JEEDOM/core/api/jeeApi.php?apikey=token&type=cmd&id=496
    name: bureau_position

Pas besoin de refaire 2 fois le jeedroid_api_cmd.

Puis coté script:

up_bureau:
  alias: up_bureau
  sequence:
    - service: shell_command.bureau_up
      data: {}
    - delay: "1"
    - service: homeassistant.update_entity
      data: {}
      entity_id: sensor.bureau_position
  mode: single
stop_bureau:
  alias: stop_bureau
  sequence:
    - service: shell_command.bureau_stop
      data: {}
    - delay: "1"
    - service: homeassistant.update_entity
      data: {}
      entity_id: sensor.bureau_position
  mode: single
down_bureau:
  alias: down_bureau
  sequence:
    - service: shell_command.bureau_down
      data: {}
    - delay: "1"
    - service: homeassistant.update_entity
      data: {}
      entity_id: sensor.bureau_position
  mode: single
set_position_bureau:
  alias: set_position_bureau
  sequence:
    - service: shell_command.bureau_position
      data:
        position: " {{ position }}"
    - delay: "1"
    - service: homeassistant.update_entity
      data: {}
      entity_id: sensor.bureau_position
  mode: single

image

Il me reste plus qu’a trouver une parade pour que le slider a 100% fonctionne. (Je suis sur des zwave fibaro, donc le max n’est pas 100, mais 99 :). Probablement besoin de jouer sur les calculs comme tu l’as fait avec le coef 2,55.

Puis en suite, c’est parti pour les 25 modules zwave a répliquer :).

Encore merci!

D’ou mon -1 pour éviter que ça coince avec le slider à 100 :slight_smile:
Le delay, j’ai juste mis 3 comme ça. Je me suis aperçu qu’il en fallait un pour que ça marche.
Bon courage pour la suite!

Hello,

J’ai un peu amélioré le calcul pour que ça soit cohérent pour toutes les valeurs (en fait, ce n’est pas +1 qu’il faut mais plutot * 100 / 99).
En fait il y a 2 facteurs à prendre en compte, le fait que le brightness soit stocké de 0 a 255, puis en deuxième, le fait que les Fibaro vont de 0 a 99 et non de 0 a 100.
J’ai aussi basculé tous les calculs au même endroit pour plus d’aisance sur la maintenance.

Pour ceux que ça pourrais intéresser, voici ce que ça donne pour les light, et qui semble plutôt bien marcher:

déclatation des lights

  - platform: template
    lights:
      ###Dimmers
      mezzanine:
        friendly_name: "Lumière Mezzanine"
        level_template: "{{ ((states('sensor.mezzanine_brightness')|int) * 255 / 99)|int }}"
        value_template: "{{ states('sensor.mezzanine_brightness')|int >0 }}"
        turn_on:
          service: script.turn_on_mezzanine
        turn_off:
          service: script.turn_off_mezzanine
        set_level:
          service: script.set_brightness_mezzanine
          data:
            brightness: " {{ brightness / 255 * 100 * 99 / 100 }}"

déclaration script

######  Dimmers

# Mezzanine
turn_on_mezzanine:
  alias: turn_on_mezzanine
  sequence:
    - service: shell_command.mezzanine_on
      data: {}
    - delay: "1"
    - service: homeassistant.update_entity
      data: {}
      entity_id: sensor.mezzanine_brightness
  mode: single
turn_off_mezzanine:
  alias: turn_off_mezzanine
  sequence:
    - service: shell_command.mezzanine_off
      data: {}
    - delay: "1"
    - service: homeassistant.update_entity
      data: {}
      entity_id: sensor.mezzanine_brightness
  mode: single