Mise en oeuvre YAML de " service: modbus.write_register" dans un liaison Modbus TCP HA-->API

Bonjour à tous,
Je commande un système à base de ESP32 pour ma piscine avec HA en communication modbus TCP client. Je voudrais mettre en œuvre les fonctions d’écriture de registre de variable locale (« input ») HA–>ESP32. Apparemment , il faut utiliser quelque chose comme ci dessous:

    service: modbus.write_register
    data:
        address: 50
        slave: 1
        hub: hub1
        value: consigne fréquence distante Pompe 1

-Dans quel fichier supplémentaire faut-il mettre ce script pour que cela fonctionne ?
-Comment faut-il modifier le fichier le fichier configuration.yaml ?
-Comment modifier ce service pour multiplier la valeur par 1000 avant la transmission ?

un truc du genre:?

    service: modbus.write_register
    data:
        address: 50
        slave: 1
        hub: hub1
        value: {(consigne fréquence distante Pompe 1)*1000}

J’ai déjà ceci qui fonctionne parfaitement:
fichier configuration.yaml:

# Loads default set of integrations. Do not remove.
default_config:

http:
  ip_ban_enabled: false
  server_port: 9767
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem
  
# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
modbus: !include modbus.yaml

fichier modbus.yaml:

  - name: hub1
    type: tcp
    host: 192.168.1.81
    port: 502

    sensors:
      - name: "Vitesse Pompe 1"
        slave: 1
        address: 1
        input_type: holding
        unit_of_measurement: tr/min
        device_class: voltage
        state_class: measurement
        scale: 0.056
        offset: 0
        precision: 0
        data_type: uint16
        scan_interval: 2
      - name: "Pression Pompe 1"
        slave: 1
        address: 0
        input_type: holding
        unit_of_measurement: m
        device_class: voltage
        state_class: measurement
        scale: 0.01
        offset: 0
        precision: 1
        data_type: uint16
        scan_interval: 2
    binary_sensors:
      - name: "Retour Marche Variateur"
        slave: 1
        address: 100
        input_type: discrete_input
        scan_interval: 2

/Bruno

Hello,

En espérant pouvoir te guider:

Aucun, c’est un appel de service, tu peux déjà tester par l’interface voir si ça fonctionne et ensuite l’ajouter dans des automations ou scripts ou alors faire un bouton qui appelle ce service.

Pas sûr de comprendre, tu montres ton fichier donc tu sais le modifier? L’addon de VSCode est top pour editer tes fichiers de configuration si tu as installé HAOS.

Ça se fait avec les templates

Si tu as par exemple un helper nombre en input consigne_pompe_1 ça devrait ressembler à:

 value: {{  state(input_number.consigne_pompe_1) | multiply(1000) }}

Je te conseille déjà de tester le service si ça fonctionne:

  1. Ouvre le menu latéral sur la gauche

  2. Clique sur Outils de développement

  3. Clique sur l’onglet Services

  4. Cherche modbus et sélectionne Modbus: write register

  5. Ou tu peux aussi passer en YAML si tu préfères:

Une fois que tu as ce que tu veux tu peux mettre ce que tu veux dans un script et appeler le script via un bouton dans l’interface :slight_smile:

Je pense que c’est un bon début. N’hésite pas si c’est pas clair pour toi.

1 « J'aime »

Merci beaucoup, je commence à y voir un peu mieux. Je vais continuer à m’autoformer, trop newbie !
(je suis beaucoup plus à l’aise avec le C et le C++).

Je ne comprenais pas le logique car les 3 autres commandes Modbus fonctionnent sans service:
ReadRegister → holding (et input ?)
ReadCoil → discrete_input
WriteCoil → switch

mais pas (directement) WriteRegister (comme dans un serveur OPC par exemple)
Bonne journée :slightly_smiling_face:
/Bruno

Hello,

Ce sont 3 services appelé. Si tu lis un registre, tu peux mettre ça dans une entité. Ça lira le registre toutes X secondes où X est la scan_interval indiqué dans l’entité:

As-tu avancé? N’hésite pas si t’as des questions, je suis en train de rebosser un peu sur ModBus et HA en ce moment donc j’ai l’esprit un peu plus frais. Par contre je fais que de la lecture de données, pas d’écriture.

J’ai avancé. j’ai dû me confronter à jinja2 et la syntaxe différente si c’est dans un modèle ou autre. J’en ai bavé avec ce qu’il fallait mettre dans value: Ceci fonctionne maintenant:

service: modbus.write_register
data:
    address: 50
    slave: 1
    hub: hub1
    value: "{{ (1000*states('input_number.consigne_exterieure_frequence_pompe1')|float)|int }}"

Merci beaucoup pour m’avoir aiguillé.
/bruno

Les 3 services :
ReadRegister → holding (et input ?)
ReadCoil → discrete_input
WriteCoil → switch
sont appelé directement et simplement dans leur définition, ici dans mon fichier modbus.yaml.
Un traitement séparé est nécessaire pour write_register

Ceci est fonctionnel dans un RPI (laid pour le moment) en liaison modbus TCP avec une armoire de commande avec un ESP32 programmé en C / C++.


Bonjour Cloom,
l’appel de service fonctionne. J’essaie, de façon pataude, d’écrire un script me permettant un appel depuis un bouton du front-end (lovelace ?). Erreur de syntaxe semble-t-il ? .
Can I have some help from you please ?
dans configuration.yaml, il y a la ligne:

script: !include scripts.yaml

Dans scripts.yaml, il y a :

sendfreqsp:
  alias: Envoyer Consigne Fréquence
  sequence:
  - service: modbus.write_register
    data:
      address: 50
      slave: 1
      hub: hub1
      value: '{{ (1000*states(''input_number.consigne_exterieure_frequence_pompe1'')|float)|int }}'
    mode: queued
    icon: mdi.AirplaneSettings
  description: write register sp freq

ça te donne quoi comme erreur?

Quand j’essaye d’enregistrer ton script il y a un problème avec le mode et l’icon, j’ai enlevé et c’est bien validé dans l’interface graphique:

Tu peux ensuite tester directement avec le menu des 3 points en haut à droite.