Modbus TCP/IP - Ecriture variable INT f(liste de choix dans HA) vers un équipements

Bonjour à toute la communauté qui nous a tous manqué ces derniers jours !

Voici mon problème :

Je suis en train d’interfacer ma Pompe à chaleur HITACHI Yutaki S Bi-Bloc via la passerelle HITACHI ATW-MBS-02 en modbus TCP/IP dont voici une partie des adresses.

  • image

Pour les switch binaire 0/1, pas de soucis (adresse 1000, 1002, 1010), j’ai réussi sans soucis.

Par contre là où je bloque c’est sur les adresses 1001, 1003 et 1004 pour lesquelles j’aimerai idéalement avoir dans l’UI de HA une liste de choix contenant les différentes description et qui renvoi directement la valeur à la passerelle en fonction de la sélection. Par exemple pour l’adresse 1004, j’aimerai avoir une liste de choix « Non ; Points ; fixe » qui renvoie 2 si on sélectionne le paramètre « Fixe »

Voici ce que j’ai commencé à faire :

modbus:
  - name: hitachi
    type: tcp
    host: 192.168.1.60
    port: 502
    switches:
      - name: pac_1000_unit_on_off
        address: 1000
        write_type: holding
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 1050
            state_on: 1
            state_off: 0

    sensors:
      - name: pac_1051_unit_mode
        address: 1051
      
      - name: pac_1052_circuit1_status
        address: 1052
        
      - name: pac_1053_circuit1_type_regul_chaud
        address: 1053
      
      - name: pac_1054_circuit1_type_regul_froid
        address: 1054
      
      - name: pac_1055_cons_temp_fixe_eau_chaud
        unit_of_measurement: °C
        address: 1055
      
      - name: pac_1056_cons_temp_fixe_eau_froid
        unit_of_measurement: °C
        address: 1056
      
      - name: pac_1057_circuit1_mode_eco_confort
        address: 1057
      
      - name: pac_1058_cons_temp_compensation_eco_chaud
        unit_of_measurement: °C
        address: 1058
        
      - name: pac_1059_cons_temp_compensation_eco_froid
        unit_of_measurement: °C
        address: 1059
      
      - name: pac_1062_cons_temp_thermostat
        unit_of_measurement: °C
        scale: 0.1
        precision: 1
        address: 1062
        
      - name: pac_1063_temp_piece_thermostat
        unit_of_measurement: °C
        scale: 0.1
        precision: 1
        address: 1063
      
      - name: pac_1090_unit_operational_status
        address: 1090
      
      - name: pac_1091_temp_exterieur
        unit_of_measurement: °C
        address: 1091
        
      - name: pac_1092_temp_arrivee_eau
        unit_of_measurement: °C
        address: 1092
        
      - name: pac_1093_temp_sortie_eau
        unit_of_measurement: °C
        address: 1093
      
      - name: pac_1097_unit_power
        unit_of_measurement: kWh
        address: 1097
      
      
      - name: pac_1201_temp_exterieur_moyenne
        unit_of_measurement: °C
        address: 1201
        
      - name: pac_1212_frequence_inverter
        unit_of_measurement: Hz
        scale: 1
        precision: 0
        address: 1212
        
      - name: pac_1214_intensite_compresseur
        unit_of_measurement: A
        scale: 1
        precision: 0
        address: 1214
        
      - name: pac_1220_debit_eau
        unit_of_measurement: m3/h
        scale: 0.1
        precision: 2
        address: 1220

Ma configuration

  • Home Assistant 2022.8.2
  • Supervisor 2022.08.3
  • Interface utilisateur : 20220802.0 - latest

Salut, Il te faut 2 choses :

  • Un input_select avec tes choix ( non, point et fixe ) ( ça peut se crée via l’interface directement)
  • Un template sensors qui se base sur ton input_select, en voici un exemple :
- sensor:
  - name: 1004_mode
    state: >
      {% if is_state("input_select.1004", "non") %}
        0
      {% elif is_state("input_select.1004", "points") %}
        1
      {% elif is_state("input_select.1004", "fixe") %}
        3
      {% else %}
        99
      {% endif %}
1 « J'aime »

Salut et merci de ta réponse rapide, je vais essayer. J’ai cependant une question, les sensors sont t’ils bidirectionnel ? c’est à dire que HA écrit la valeur vers ma pompe à chaleur ?

Bonjour,

non, les entités sensors ne servent qu’a recevoir des informations.

Il ne permet pas d’écrire dans les registres modbus

C’est bien ce qu’il me semblait d’où ma question, du coup cela ne répond pas à mon besoin mais merci quand même :facepunch:. Je vais modifier le titre pour être plus explicite.

Du coup quelqu’un aurait-il une idée pour écrire une valeur vers un équipement modbus à partir de la sélection d’une liste de choix dans HA ? Est-ce simplement possible dans HA sans passer par nodered ?

Oui, mais il vous faut passer par un appel de service

Vous pouvez réaliser une automation ou un script qui lorsque vous changez la valeur d’un « input.select » cela envoi la valeur au service pour écriture dans le registre modbus.

1 « J'aime »

Merci, la doc modbus m’a déjà bien aidé, relativement bien faite j’ai trouvé.

Pour en revenir à ta proposition, je n’y avais pas pensé mais j’ai le pressentiment que ce schéma d’intégration va generer de nombreuse automatisations ce qui me semble compliqué à gérer à l’avenir.

En fait je me demande si mettre en place les listes de choix dans HA et gérer dans nodered l’écriture modbus ne serait pas plus simple.

J’attends vos avis éclairé :stuck_out_tongue_winking_eye:

Ps: J’ai pas de PC pour bidouiller pour le moment car en vadrouille

Hello !

Je viens vous partager ma solution finale :

  • Dans HA, j’ai seulement créer un input_select pouvant prendre différentes valeurs sous la forme d’une chaine de caractère ( froid / chaleur / auto )
    image

  • Dans Nodered j’ai ensuite créé un flow qui en cas de changement d’état de l’input_select, traduit la chaine de caractère sélectionné dans HA en nombre (froid => 0 / chaleur => 1 / auto => 2) puis va écrire ce nombre à l’adresse Modbus qui va bien

Cela me parait la solution la plus simple, cependant il me reste à mettre un second flux qui mettra à jour l’input_select au cas où quelqu’un change localement la valeur sur la PAC.

Voici mon flow nodered complet
[
    {
        "id": "2f7fb9c6403b335c",
        "type": "tab",
        "label": "PAC Hitachi",
        "disabled": false,
        "info": ""
    },
    {
        "id": "fdd93af093a7ccf6",
        "type": "modbus-write",
        "z": "2f7fb9c6403b335c",
        "name": "Write adress: 1007",
        "showStatusActivities": false,
        "showErrors": false,
        "unitid": "",
        "dataType": "HoldingRegister",
        "adr": "1007",
        "quantity": "1",
        "server": "6837609d3ee526a4",
        "emptyMsgOnFail": false,
        "keepMsgProperties": false,
        "x": 670,
        "y": 100,
        "wires": [
            [],
            [
                "383623b69801446c"
            ]
        ]
    },
    {
        "id": "11a4cc2002035738",
        "type": "server-state-changed",
        "z": "2f7fb9c6403b335c",
        "name": "state_changed: Mode ECO/Confort",
        "server": "d8cde96c5bee6be7",
        "version": 3,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "input_select.hitachi_1057_mode_eco_confort",
        "entityidfiltertype": "exact",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 1,
        "output_only_on_state_change": true,
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": true,
        "ignorePrevStateUnknown": true,
        "ignorePrevStateUnavailable": true,
        "ignoreCurrentStateUnknown": true,
        "ignoreCurrentStateUnavailable": true,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 180,
        "y": 100,
        "wires": [
            [
                "52ba0c04ab773b5b",
                "066b4b6c53aea33d"
            ]
        ]
    },
    {
        "id": "52ba0c04ab773b5b",
        "type": "function",
        "z": "2f7fb9c6403b335c",
        "name": "Return 0/1",
        "func": "if(msg.payload == 'ECO'){\n    msg.payload = '0';\n    msg.payload = Number(msg.payload);\n    return msg;\n} else if (msg.payload == 'Confort'){\n    msg.payload = '1';\n    msg.payload = Number(msg.payload);\n    return msg; \n} else {\n    return null;\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 450,
        "y": 100,
        "wires": [
            [
                "fdd93af093a7ccf6",
                "d9de6485850cb0d4"
            ]
        ]
    },
    {
        "id": "d48deecd9bf770e3",
        "type": "inject",
        "z": "2f7fb9c6403b335c",
        "name": "Debug - send: 1",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "1",
        "payloadType": "num",
        "x": 400,
        "y": 180,
        "wires": [
            [
                "fdd93af093a7ccf6"
            ]
        ]
    },
    {
        "id": "0376dc9f1b9d1a2c",
        "type": "inject",
        "z": "2f7fb9c6403b335c",
        "name": "Debug - send: 0",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "0",
        "payloadType": "num",
        "x": 400,
        "y": 140,
        "wires": [
            [
                "fdd93af093a7ccf6"
            ]
        ]
    },
    {
        "id": "4ec82ec3efe29f20",
        "type": "modbus-write",
        "z": "2f7fb9c6403b335c",
        "name": "Write adress: 1001",
        "showStatusActivities": false,
        "showErrors": false,
        "unitid": "",
        "dataType": "HoldingRegister",
        "adr": "1001",
        "quantity": "1",
        "server": "6837609d3ee526a4",
        "emptyMsgOnFail": false,
        "keepMsgProperties": false,
        "x": 670,
        "y": 320,
        "wires": [
            [],
            [
                "60cfb5d7d11bf7db"
            ]
        ]
    },
    {
        "id": "65c548f3c2714cfb",
        "type": "server-state-changed",
        "z": "2f7fb9c6403b335c",
        "name": "state_changed: Mode chaud/froid/auto",
        "server": "d8cde96c5bee6be7",
        "version": 3,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "input_select.hitachi_1001_unit_mode",
        "entityidfiltertype": "exact",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 1,
        "output_only_on_state_change": true,
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": true,
        "ignorePrevStateUnknown": true,
        "ignorePrevStateUnavailable": true,
        "ignoreCurrentStateUnknown": true,
        "ignoreCurrentStateUnavailable": true,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 190,
        "y": 320,
        "wires": [
            [
                "710a25518eb040d4",
                "a6582ed0e0e447be"
            ]
        ]
    },
    {
        "id": "710a25518eb040d4",
        "type": "function",
        "z": "2f7fb9c6403b335c",
        "name": "Return 0/1/2",
        "func": "if(msg.payload == 'Climatisation'){\n    msg.payload = '0';\n    msg.payload = Number(msg.payload);\n    return msg;\n} else if (msg.payload == 'Chauffage'){\n    msg.payload = '1';\n    msg.payload = Number(msg.payload);\n    return msg; \n} else if (msg.payload == 'Auto (chaud/froid)'){\n    msg.payload = '2';\n    msg.payload = Number(msg.payload);\n    return msg; \n} else {\n    return null;\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 430,
        "y": 320,
        "wires": [
            [
                "4ec82ec3efe29f20",
                "218fd559fb70a4d6"
            ]
        ]
    },
    {
        "id": "5faf0c5e282ad85b",
        "type": "inject",
        "z": "2f7fb9c6403b335c",
        "name": "Debug - send: 1",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "1",
        "payloadType": "num",
        "x": 400,
        "y": 400,
        "wires": [
            [
                "4ec82ec3efe29f20"
            ]
        ]
    },
    {
        "id": "01b54de230cfb093",
        "type": "inject",
        "z": "2f7fb9c6403b335c",
        "name": "Debug - send: 0",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "0",
        "payloadType": "num",
        "x": 400,
        "y": 360,
        "wires": [
            [
                "4ec82ec3efe29f20"
            ]
        ]
    },
    {
        "id": "492e22f539eed6a1",
        "type": "inject",
        "z": "2f7fb9c6403b335c",
        "name": "Debug - send: 2",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "2",
        "payloadType": "num",
        "x": 400,
        "y": 440,
        "wires": [
            [
                "4ec82ec3efe29f20"
            ]
        ]
    },
    {
        "id": "60cfb5d7d11bf7db",
        "type": "debug",
        "z": "2f7fb9c6403b335c",
        "name": "Sent",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 870,
        "y": 320,
        "wires": []
    },
    {
        "id": "a6582ed0e0e447be",
        "type": "debug",
        "z": "2f7fb9c6403b335c",
        "name": "Received",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 440,
        "y": 280,
        "wires": []
    },
    {
        "id": "218fd559fb70a4d6",
        "type": "debug",
        "z": "2f7fb9c6403b335c",
        "name": "Decoded",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 640,
        "y": 280,
        "wires": []
    },
    {
        "id": "383623b69801446c",
        "type": "debug",
        "z": "2f7fb9c6403b335c",
        "name": "Sent",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 870,
        "y": 100,
        "wires": []
    },
    {
        "id": "d9de6485850cb0d4",
        "type": "debug",
        "z": "2f7fb9c6403b335c",
        "name": "Decoded",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 640,
        "y": 60,
        "wires": []
    },
    {
        "id": "066b4b6c53aea33d",
        "type": "debug",
        "z": "2f7fb9c6403b335c",
        "name": "Received",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 440,
        "y": 60,
        "wires": []
    },
    {
        "id": "6837609d3ee526a4",
        "type": "modbus-client",
        "name": "Hitachi",
        "clienttype": "tcp",
        "bufferCommands": true,
        "stateLogEnabled": false,
        "queueLogEnabled": false,
        "failureLogEnabled": true,
        "tcpHost": "192.168.1.60",
        "tcpPort": "502",
        "tcpType": "DEFAULT",
        "serialPort": "/dev/ttyUSB",
        "serialType": "RTU-BUFFERD",
        "serialBaudrate": "9600",
        "serialDatabits": "8",
        "serialStopbits": "1",
        "serialParity": "none",
        "serialConnectionDelay": "100",
        "serialAsciiResponseStartDelimiter": "0x3A",
        "unit_id": 1,
        "commandDelay": 1,
        "clientTimeout": 1000,
        "reconnectOnTimeout": true,
        "reconnectTimeout": 2000,
        "parallelUnitIdsAllowed": true
    },
    {
        "id": "d8cde96c5bee6be7",
        "type": "server",
        "name": "HomeAssistant_Server",
        "version": 1,
        "legacy": false,
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true
    }
]

Du coup je ferai un tuto quand mon intégration sera terminé, je vais certainement vous solliciter pour la création d’une carte plus conviviale que celle actuelle.

1 « J'aime »

Bonsoir
Tres interressé par un tuto pas à pas…
« Seulement créer un input_select »… Cela veut dire quoi?

Salut !

Un input_select, c’est une liste de choix en gros.

Tu es celui que j’ai déjà croisé sur easydomoticz ?

Pour le tuto c’est malheureusement dans mes priorités basse mais promis je ferai ça, pour le moment je termine mon tableau électrique car j’ai promis à madame :joy:. Il faut dire que cela fait 2 ans qu’il est ouvert et que j’ai tiré en volant beaucoup de chose…

Bonjour, oui c’est bien moi.
Je vais essayer d’avancer tout seul en découvrant ha.
Je n’ai ma passerelle que dans 10j, donc j’ai encore un peu le temps de me familiariser avec le bébé
bonne journée

Bonjour à tous.
Je vais bientôt avoir la PAC Hitachi Yutaki S Combi 2.0 installé, et comme vous pas vraiment envie d’être forcé de passer par une passerelle propriétaire et une API internet.
Du coup je suivais ce thread et aussi celui sur easydomoticz depuis quelques jours et aimerais faire la même chose.

Par contre, j’ai l’impression que Hitachi ne veut plus qu’on utilise interface Modbus.
C’est peut-être mes mots-clés mais seulement trouver RTU HITACHI ATW-MBS-02 en vente sur maison-energy (pour la France en tout cas) à 408€.
J’ai demandé à mon installateur voir si lui arrive à se le procurer via son fournisseur (peut-être mois chère), mais je n’ai pas grand espoir.

Du coup @Neuvidor la solution finale c’est celle avec NodeRed (du 15 août) ou bien la config HA seule du forum easydomoticz ?

Merci pour toutes les infos jusque là!

+1
Je suis exactement dans le même cas.

J’utilise la combinaison des 2, j’essayerai de vous partager ce que j’ai fait ce weekend mais je ne promets rien.

1 « J'aime »

Bonjour
C’est bien ça on va être une petite communauté a utiliser le combo modbus/ PAC Hitachi 2.0.
Ma passerelle modbus a aussi du retard je pense que la pénurie de composant n’y est pas pour rien. ( C’était dispo début septembre, mais le temps que je me décide plus de stock, en attente livraison par Hitachi en S46…).
Pour le prix y a un site allemand qui l’a propose a un peu moins de 300€+fdp. Je ne sais pas ils livrent en France mais en tout cas y a paiement PayPal)

Truc de dingue, j’ai acheté à 240€ fdpi ma passerelle en novembre 2019 chez maison-energy. Les prix s’envolent ! Désolé je n’ai pas eu le temps ce week-end de faire quoi que ce soit.

Merci @cocof pour avoir partagé le site allemand, commandé, à voir quand ça arrive. L’installateur pouvait l’avoir a 350€ HT, alors que là c’est 315€ fdp inclus.

Par contre mon installateur à l’air de pensé qu’il faut quand même passerelle/interface Hi-Kumo, il attend confirmation de Hitachi.
Mais j’essaie de le rassurer que normalement pas besoin de quoi que ce soit d’autres, même pas de thermostat Hitachi dans la maison vu que j’ai déjà des sondes de température partout et ces Home-Assistant qui va gérer quand le chauffage doit se mettre enroulé.

D’après la notice du Yutaki S Combi 2.0, au pire on peut brancher en filaire le relay/thermostat que j’utilise pour la vieille chaudière fioul, même si c’est juste pour démarrer/arrêter le chauffage.

Mais si j’ai bien compris, il suffit de brancher le ATW-MBS-02:

  • H-Link: cable vers le YUTAKI
  • Ethernet: RJ45 branché sur le switch réseau

Et puis configuration Modbus TCP dans Home-Assistant (et Node-Red pour mode écriture)
C’est bien ça ?

Normalement oui, on attend tous le tuto de @Neuvidor :smiley:
Je reçois ma passerelle cette semaine normalement !, Si j’arrive à intégrer dans ha a l’aide des posts de Neuridor, j’essayerai de résumer en pas à pas.

Salut @cocof,

Je sais mais pas facile d’avancer entre les enfants, les 30ans de madame cette semaine et les soucis de commande d’éclairage où j’ai du me faire un PCB…

En attendant je viens de faire un résumé de mon câblage pour illustrer le futur tuto :