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: https://forum.hacf.fr/t/creation-dun-pont-jeedom-vers-ha/1104), 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

Bonjour !

J’avais le même problème avec mon module dimmer Sunricher SR-ZG9040A en Zigbee.
Pour la luminosité, entre 0 et 30% ainsi qu’entre 65 et 100%, rien ne se passe. Donc seule la plage 30-65% m’intéresse. Comme j’utilise une télécommande Philips Dimmer pour régler la luminosité, j’avais l’impression d’appuyer plusieurs fois sur + ou - pour rien avant d’arriver dans la plage utile.

Ainsi, j’ai regardé ce que tu proposes et ce sujet.

Voici ce que cela donne, dans config.yaml :
light.salon_zha est l’entité qui apparait dans ZHA et light.salon est celle que je créé.

light:
  - platform: template
    lights:
      salon:
        friendly_name: "Lumière du Salon"
        level_template: >-
          {% set b = state_attr('light.salon_zha', 'brightness') | float %}
          {{ (2.684 * b - 201.3) | int }}
        value_template: >-
          {% if is_state('light.salon_zha', 'on') %}
            on
          {% elif is_state('light.salon_zha', 'off') %}
            off
          {% else %}
            unknown
          {% endif %}
        turn_on:
          service: light.turn_on
          data:
            entity_id: light.salon_zha
        turn_off:
          service: light.turn_off
          data:
            entity_id: light.salon_zha
        set_level:
          service: light.turn_on
          data_template:
            entity_id: light.salon_zha
            brightness: "{{ ((brightness + 201.3) / 2.684) | int }}"

Pour obtenir les valeurs 2.684 et 201.3 il faut réaliser une équation en fonction de vos plages utiles.

Interessant
Par contre c’est uni directionnel ?
Je m’explique.
Si je bouge mes volets en manuel ou depuis jeedom, est ce que la valeur d’ouverture remonte dans ha ?
A priori comme c’est fait nom ?
Du coup moyen de poller automatiquement ou d’envoyer une requette depuis jeedom a chaque mise a jour ?
Sinon possible de recuperer la valeur live depuis mqtt je pense dans level template et value template ?

Bonjour j’ai un délai important (plusieurs secondes) entre le moment ou je change la luminosité ou on/off et que ça se répercute sur l’icone. Je suis sur du fibaro avec le plugin natif zwave jeedom
Est ce normal ?
Merci

Hello, tu as bien mis le delay a 1? Après ça ne m’étonne pas que ce soit pas immédiat.
Je ne peux plus faire de tests de ce fonctionnement, ca fait un moment que j’ai tout basculé sous HA et que je n’utilise plus jeedom :slight_smile: . La vm tourne toujours, mais je n’en fais rien :slight_smile:

Oui j’ai bien un délai à 1 seconde.
J’ai l’impression qu’il n’est pas suffisant. Dans mon design jeedom ça met plus d’une seconde à afficher l’état rééel après modif d’une commande zwave.
Je pense qu’on rate du coup le refresh dans HA et il faut attendre que HA rafraichisse au global. Des fois ça met plus de 10 secondes.
Du coup ma prochaine étape est de basculer vers ZWAVE JS UI… Gros boulot en perspective…
Je vais attendre la 4.3 de jeedom car il y a un assistant pour faciliter ces migrations.
Tu me conseilles de garder ZWAVE JS UI sur une VM seule ? (comme mon zigbee2mqtt ?)

C’est possible pour le delais.

En ce sui concerne la migration, tout dépend de ta stratégie, mais faire cohabiter 2 systèmes domotique n’est pas une solution a long terme. Pour ma part je suis zwave js ui directement dans ha (add on) et ca marche bien.
D’un point de vue migration, ca reste simple, vu que les devices sont deja appairés sur la clef zwave. A partir du moment ou tu bascules la clef, tu récupère tout. Il y a peut être juste a revoir les noms si tu le souhaites.

Bonjour Golfvert, Je suis également en préparation de migration vers HA, mon premier objectif étant de prendre le contrôle de jeedom par HA.

Je cherche à utiliser le thermostat de jeedom depuis HA, concernant les commandes simples ça marche avec API rest sans difficultés, par contre je voudrais piloter la consigne et je me demande si ta solution est transposable dans ce cas ?

Je débarque complétement sur HA et pour l’instant je suis encore assez perdu.

Si c’est une commande dans jeedom, il n’y a pas de raison…
Comme expliqué, je fais cela avec nodered (presque exclusivement). Donc, envoyer une commande a jeedom, c’est possible. Je pilote mon thermostat migo comme ça. L’intégration dans HA n’est pas aussi évoluée que celle de jeedom et donc je le garde pour ça.