[TUTO] SPA INTEX dans Home Assistant en MQTT

MAJ du 21/06/2022 : utilisation de mqtt en !include et grosse optimisation du code

Objectif

Intégrer le contrôle de votre spa INTEX dans Home Assistant. faire des automatisations pour la filtration ou pour une mise hors gel (oui je baigne l’hivers donc je ne le vide pas en période hivernal) etc…

Pré requis :

  • HA ^^
  • un broker MQTT comme mosquitto broker (et mqtt explorer pour faire les tests par exemple)
  • un spa (vérifier le model dans les liens ci dessous)
  • un esp flashé prêt à l’emploi (lien ci dessous)
  • du wifi accessible vers spa (le boitier que j’utilise à une antenne pour amplifier le signal)
  • un maillot de bain (pas franchement obligatoire, rien de mieux qu’un jacuzzi à poil)

A noter

Suite à mon post d’origine [Partage] Connecter Controler son spa Intex via MQTT - Home Assistant - Tutoriels & Partages / Intégration - Home Assistant Communauté Francophone (hacf.fr) N’ayant pas les compétences j’ai décidé d’utiliser le boitier tout prêt de @PaTiTan Système wifi (MQTT) pour Spa INTEX - Communauté HACF / Petites Annonces - Home Assistant Communauté Francophone qui utilise ce tuto sur GitHub : jnsbyr/esp8266-intexsbh20: MQTT WiFi remote control for the Intex PureSpa SB-H20 whirlpool (github.com)
Autant j’arrive à faire quelques soudures, mais dès que j’attaque ce genre de projet, mes plaques ressemble à de la dentelle lol

Sur ce lien, vous aurez tous les topic que vous pourrez écouter : jnsbyr/esp8266-intexsbh20: MQTT WiFi remote control for the Intex PureSpa SB-H20 whirlpool (github.com) et rajouter autant de sensors que vous le souhaitez.

Branchement du boitier

Quand vous recevrez votre boitier, il suffira de le connecter entre le bloc moteur et l’ecran de votre spa. il s’agira juste de dévisser un cable et d’y mettre le boitier. Un tournevis cruciforme pour une seule vis. le tuto du branchement vous sera fourni. (faire le branchement lorsque le spa est débranché électriquement!)
Passer l’interrupteur du boitier sur ON et rebrancher le spa, attendre quelques secondes pour que le boitier se connecte à votre wifi. Si vous le pinger, ou que vous le voyer dans votre DHCP (je vous conseillerai de faire une reservation d’adresse ip comme d’habitude) testez les fonctions de votre spa à partir de l’ecran de commande , cela aidera à remonter tout les informations dans les topic de votre broker mqtt.

Les informations que l’on récupère dans MQTT Explorer (avant meme de s’attaquer à HA)

image

Cette partie n’est pas obligatoire, mais cela permet de verifier le bon fonctionnement du boitier vers mqtt.
Ce qui va nous interessé en premier, ce sont les valeurs du Topic pool : bubble, filter, heater, power et le sous topic water qui indiquera la temperature actuelle (tempAct) et la température souhaitée (tempSet)

Que faire de toutes ces infos?

Nous allons créer des sensors, un climate, et des switchs…c’est du mqtt, et la methode que vous connaissez déjà - plateform: mqttsera déprécié dans peu de temps; sur ce, les exemples de code ci dessous seront optimisés pour l’intégration actuelle.
J’utilise également des !include :

mqtt:
 climate: !include mqtt_climate.yaml
 number: !include mqtt_number.yaml
 sensor: !include mqtt_sensor.yaml
 switch: !include mqtt_switch.yaml

les sensors :

Pour créer le sensor de température actuelle de l’eau , de la température souhaité et de la temperature du boitier, il vous suffira de copier coller ce code dans votre fichier

donc j’ai rajouté ces lignes dans mon mqtt_sensor.yaml

code sensors
###################################################################
##########                   SPA INTEX                   ##########
###################################################################
# Temperature à atteindre
- name: "intex_temp_set"
  state_topic: "pool/water/tempSet"
  unique_id: "intex_temp_set"
  unit_of_measurement: 'c'

# Temperature de l eau
- name: "intex_temp_actu"
  unique_id: mqtt_intex_temp_actu
  icon: mdi:thermometer-water
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  state_topic: "pool/water/tempAct"
  device_class: temperature
  state_class: measurement
  unit_of_measurement: °C
      
# Temperature du boitier
- name: "intex_temp_boitier"
  unique_id: mqtt_intex_temp_boitier
  icon: mdi:thermometer-alert
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  state_topic: "wifi/temp"
  device_class: temperature
  state_class: measurement
  entity_category: diagnostic
  unit_of_measurement: °C

et nous les retrouvons :
image
ou avec une carte mini graph :
image

2

→ le tempAct correspond à la température actuelle, et tempSet à la température que vous souhaitée.

Je ne vous mets pas le code des cartes, HA est bourré d’assistant maintenant et chacun aura ses préférences.

/!\ conseil : vider le cache de votre navigateur pendant vos tests ! :wink: (merci à 𝓢𝓮𝓽𝓱#9267 et @fredarro pour leur aide sur notre chan discord)

les switchs :

et oui, les switch…ce serait quand même pratique d’allumer le spa ou de l’éteindre; de programmer le filtre ou de le relancer automatiquement quand il s’arrête; de pouvoir actionner le chauffage …
Et comme tout en domotique, ce qui est inutile est totalement indispensable !

Je souhaites donc les switchs :

  • On/Off du spa,
  • On/Off du filtre,
  • On/Off des bulles,

Contrairement aux sensors, où il suffit de lire l’information d’un topic, pour envoyer une nouvelle valeur (changer un on en off par exemple) il faudra utiliser le sous topic ‹ command › !
ce n’est pas compliqué c’est expliqué là : jnsbyr/esp8266-intexsbh20: MQTT WiFi remote control for the Intex PureSpa SB-H20 whirlpool (github.com) avec le tableau Subscribed Topics
image

Code à coller dans le fichier mqtt_switch.yaml

code switch
###############################################################
##############         SPA INTEX                ###############
###############################################################
# Switch on off
- name: intex_power
  unique_id: mqtt_intex_power
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  payload_on: "on"
  payload_off: "off"
  state_topic: pool/power
  command_topic: pool/command/power

# swicth des bulles
- name: intex_bubble
  unique_id: mqtt_intex_bubble
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  payload_on: "on"
  payload_off: "off"
  state_topic: pool/bubble
  command_topic: pool/command/bubble

# switch du filtre
- name: intex_filter
  unique_id: mqtt_intex_filter
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  payload_on: "on"
  payload_off: "off"
  state_topic: pool/filter
  command_topic: pool/command/filter

En l’intégrant à une carte vous allez vous retrouver avec ca :
image
(n’oubliez pas de respecter votre nomenclature sur le nommage de vos entités et de mettre des friendly name pour le coté WAF :slight_smile:

Créer une entité Climate pour contrôler la température

Il suffira de coller ce code dans le fichier mqtt_climate.yaml :

code climate
###################################################
#######                SPA INTEX             ######
###################################################
- name: intex_heater
  unique_id: "mqtt_intex_heater"
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  payload_on: "on"
  payload_off: "off"
  modes:
    - "off"
    - "heat"
  mode_state_topic: "pool/heater"
  mode_state_template: >-
    {% set values = { 'off':'off','on':'heat','standby':'heat'} %}
    {{ values[value] if value in values.keys() else 'off' }}
  mode_command_topic: "pool/command/heater"
  mode_command_template: >-
    {% set values = {'heat':'on','off':'off'} %}
    {{ values[value] if value in values.keys() else 'off' }}
  action_topic: "pool/heater"
  action_template: >-
    {% set values = { 'off':'off','on':'heating','standby':'idle'} %}
    {{ values[value] if value in values.keys() else 'off' }}
  current_temperature_topic: "pool/water/tempAct"
  temperature_state_topic: "pool/water/tempSet"
  temperature_command_topic: "pool/command/water/tempSet"
  temperature_command_template: "{{ value | int }}"
  temp_step: 1.0
  precision: 1.0
  min_temp: 20
  max_temp: 40

Vous pourrez ensuite faire une carte climate :
image

Si vous préférez avoir un slide pour regler la temperature voici le code à coller dans mqtt_number.yaml

code number
###################################################
#######                SPA INTEX             ######
###################################################
- name: intex_temperature_set 
  unique_id: mqtt_intex_temperature_set
  availability:
    - topic: "wifi/state"
      payload_available: "online"
      payload_not_available: "offline"
      value_template:  >-
        {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
        {{ values[value] if value in values.keys() else 'offline' }}
  min: 20
  max: 40
  step: 1.0
  state_topic: "pool/water/tempSet"
  command_topic: "pool/command/water/tempSet"
  command_template: "{{ value | int }}"

image
il faudra alors rajouter un switch pour allumer le chauffage.

Conclusion

Voila, je penses que la boucle est bouclée.
Pour ma part, je vais continuer sous Node Red pour par exemple recevoir une notification quand l’eau arrive en température et prochainement coupler les informations avec la sonde de PH.

Gros merci aussi à @piitaya pour son partage de code et son aide. !

exemple, aperçu :

pour un lovelace sur tablette ou ordi ou une microsoft surface :
2

pour un lovelace sur telephone avec (l’excellent) Mushroom :
3

2 « J'aime »

Merci pour le tuto. J’utilise le même système et ça fonctionne bien.
Je n’ai pas la même configuration MQTT donc je vous la partage si quelqu’un veut s’en inspirer.

J’ai 6 entités :

  • switch on/off pour le power
  • switch on/off pour le filtre
  • switch on/off pour les bulles
  • climate pour le chauffage : modes heat et off, remontée de la temperature de l’eau et réglage de la température.
  • sensor pour la température de l’eau
  • sensor pour la température du boitier

mqtt:
  climate:
    - name: Intex Spa Heater
      icon: mdi:fire
      unique_id: "mqtt_intex_spa_heater"
      availability:
        - topic: "wifi/state"
          payload_available: "online"
          payload_not_available: "offline"
          value_template:  >-
            {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
            {{ values[value] if value in values.keys() else 'offline' }}
      payload_on: "on"
      payload_off: "off"
      modes:
        - "off"
        - "heat"
      mode_state_topic: "pool/heater"
      mode_state_template: >-
        {% set values = { 'off':'off','on':'heat','standby':'heat'} %}
        {{ values[value] if value in values.keys() else 'off' }}
      mode_command_topic: "pool/command/heater"
      mode_command_template: >-
        {% set values = {'heat':'on','off':'off'} %}
        {{ values[value] if value in values.keys() else 'off' }}
      action_topic: "pool/heater"
      action_template: >-
        {% set values = { 'off':'off','on':'heating','standby':'idle'} %}
        {{ values[value] if value in values.keys() else 'off' }}
      current_temperature_topic: "pool/water/tempAct"
      temperature_state_topic: "pool/water/tempSet"
      temperature_command_topic: "pool/command/water/tempSet"
      temperature_command_template: "{{ value | int }}"
      temp_step: 1.0
      precision: 1.0
      min_temp: 20
      max_temp: 40
  
  switch:
    - name: Intex Spa Power
      unique_id: mqtt_intex_spa_power
      icon: mdi:power
      availability:
        - topic: "wifi/state"
          payload_available: "online"
          payload_not_available: "offline"
          value_template:  >-
            {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
            {{ values[value] if value in values.keys() else 'offline' }}
      payload_on: "on"
      payload_off: "off"
      state_topic: pool/power
      command_topic: pool/command/power

    - name: Intex Spa Bubble
      icon: mdi:chart-bubble
      unique_id: mqtt_intex_spa_bubble
      availability:
        - topic: "wifi/state"
          payload_available: "online"
          payload_not_available: "offline"
          value_template:  >-
            {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
            {{ values[value] if value in values.keys() else 'offline' }}
      payload_on: "on"
      payload_off: "off"
      state_topic: pool/bubble
      command_topic: pool/command/bubble

    - name: Intex Spa Filter
      unique_id: mqtt_intex_spa_filter
      icon: mdi:air-filter
      availability:
        - topic: "wifi/state"
          payload_available: "online"
          payload_not_available: "offline"
          value_template:  >-
            {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
            {{ values[value] if value in values.keys() else 'offline' }}
      payload_on: "on"
      payload_off: "off"
      state_topic: pool/filter
      command_topic: pool/command/filter

  sensor:
    - name: Intex Spa Case Temperature
      unique_id: mqtt_intex_spa_case_temperature
      icon: mdi:thermometer-alert
      availability:
        - topic: "wifi/state"
          payload_available: "online"
          payload_not_available: "offline"
          value_template:  >-
            {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
            {{ values[value] if value in values.keys() else 'offline' }}
      state_topic: "wifi/temp"
      device_class: temperature
      state_class: measurement
      entity_category: diagnostic
      unit_of_measurement: °C
      
    - name: Intex Spa Water Temperature
      unique_id: mqtt_intex_spa_water_temperature
      icon: mdi:thermometer-water
      availability:
        - topic: "wifi/state"
          payload_available: "online"
          payload_not_available: "offline"
          value_template:  >-
            {% set values = { 'offline':'offline','online':'online','error':'offline'} %}
            {{ values[value] if value in values.keys() else 'offline' }}
      state_topic: "pool/water/tempAct"
      device_class: temperature
      state_class: measurement
      unit_of_measurement: °C

EDIT: ajout de deux capteurs (température de l’eau et du boitier)

1 « J'aime »

du coup pour le climate il me faudrait un !include mqtt_climate.yaml par exemple? c’est ca?

Tu peux directement ajouter le code que j’ai proposé dans le configuration yaml comme tu l’as fait pour les sensors.

ca va etre depreciated , je vais essayer de faire ca bien alors :slight_smile: et de faire les !include. je mettrais à jour le tuto ensuite.
(petite dedicace : tip top mushroom !)

Le code que tu as utilisé pour tes switchs est deprecated mais celui pour les sensors est bien :+1:

Oui faut utiliser

mqtt:
   climate: 
       - name: ...
   switch: 
       - name: ...

et non

climate:
   - platform: mqtt
     name: ...
switch:
   - platform: mqtt
     name: ...

effectivement, tout cela est plus adapté :

et fonctionnel !
je modifierais le tuto :slight_smile: merci pour ton aide et tes conseils :slight_smile:

Je viens d’ajouter deux sensors : température de l’eau et du boitier.

1 « J'aime »

nikel tout ca :

2

je mets à jour le tuto demain :slight_smile: merci @piitaya pour ton aide

1 « J'aime »

Merci à vous pour le tuto :wink:

1 « J'aime »

Tuto fini !

je penses que c’est bon.

merci de partager vos cartes lovelace !!!

perso j’aime bien cette carte qui reprend une carte climate et les bulles dans la carte lorsque le filtre ou les bulles du spa est activé par exemple :

3

code
type: custom:fluid-level-background-card
card:
  type: thermostat
  entity: climate.intex_heater
  name: ' '
entity: sensor.intex_temp_actu
fill_entity: switch.intex_filter
level_color:
  - 73
  - 164
  - 248