Pool command (MyINDYGO) sur HA

Bonjour,

Je suis équipé d’une horloge connectée Pool Command INDYGO sur ma piscine couplée à un électrolyseur Epool Technologie.
Un super boulot à été fait sur l’électrolyseur (bravo aux personnes ayant réalisé ce topic :+1: :+1:) mais je souhaiterais à présent intégrer le Pool Command à HA (comme cela à été réaliser pour le TILD)
D’ailleurs les 2 produits se ressemblent énormément mais je n’ai clairement pas le niveau pour réussir cette intégration…
Je ne comprends rien au MQTT…
Quelqu’un s’est il penché sur le sujet?

Merci d’avance :pray:

1 « J'aime »

Je serais également très intéressé, le système Indygo a l’air prometteur, mais sans intégration à HA ça l’écarte de ma liste de choix pour la gestion de ma piscine

1 « J'aime »

Bonjour,

@kalhimeo c’est sur que Indygo n’est pas intégrable à HA ?
Tu as d’autre solution de gestion de piscine via domotique semblables ?

Je vais faire construire ma piscine et c’est maintenant que je dois faire moi choix avec le pisciniste :slight_smile:

Merci pour vos réponses

À ma connaissance non, pas d integration disponible pour myindygo. Je leur ai même écrit pour savoir si ils seraient disposés de créer une api pour la communauté mais ils n ont même pas pris la peine de me répondre.

Je pense me diriger vers une centrale de chez Hayward type control station ng (existe aussi en version électrolyse, voir aussi la marque sugar valley pour la génération précédente un peu moins cher).
Je ne sais pas si l integration sera aisée, mais en tout cas elle semble possible avec récupération de beaucoup de données via un petit module esp tasmota et mqtt (HA NeoPool MQTT: integration of Tasmota NeoPool (for Sugar Valley, Hayward/Aquarite, Bayrol devices) - Share your Projects! - Home Assistant Community).
Il y a aussi une intégration vigipool assez recente dont le développeur intervient sur ce forum dans un autre sujet, mais il y a peu d informations disponibles sur ce qui est exploitable.

Bonjour
Avez vous progressé sur le sujet.
Ayant aussi un poil command, je suis très intéressé

Bonjour
Aucune avancée… :disappointed:
J’ai écris à Pool technologie, solem et Indigo… Réponse: « aucune ouverture vers d’autres environnements domotique! »
Quel regret d’avoir investi dans cette marque…
Je n’ai clairement pas les capacités pour tenter de « craquer » ce système! Dommage, car vraiment le fait d’être aussi fermé me donne encore plus l’envie de contourner leur système… :smiling_imp:

Et oui
Quel dommage, la saison approche à grand pas…
Je n’ai pas la compétence non plus mais avec une bonne âme sur le forum nous pourrions avoir des pistes et y participer activement.
Est ce que quelqu’un aurait déjà une idée de comment prendre la pelote correctement pour commencer à la dérouler ?

Des news sur ce sujet ? , je suis en plein projet de construction piscine et j’étais parti sur le système poolcommand mais vu qu’il n’y a aucune intégration ou hack d’intégration pour Homa assitant, j’hésite …

Personnellement je n’ai aucune nouvelle et pas trop d’idée de comment faire

un petit up pour voir si on trouve une âme charitable qui pourrait peut être aiguiller de comment faire

Bonjour, je travaille dessus en script python .
L’analyse des flux sur socket io dans le dev tools me permet d’arriver à avoir les températures.
Par contre pour l’envoi d’une commande (lumière), le script arrive à envoyer au serveur mais ca ma fait sauter les commandes dans l’application et le webserveur donc j’ai du hier désappareiller et réappareiller le pool command. Je vais pas trop jouer pendant cette période caniculaire.
Franchement il pourrait nous proposer une API , ca serait largement plus simple que de reconstruire le process .

Bonjou @B_Leq : pouvons-nous discuter en MP ? Je cherche à intégrer mon pool command également dans HA :slight_smile:

oui pas de souci
mais ton profil est privé

Bon j’ai changé de stratégie car il faut que je comprenne comment faire un plugin jeedom.
Du coup, j’ai créé un docker sur mon nas synology qui remonte l’info sur mon serveur mosquitto MQTT et je récupère l’info dans jeedom.
image
Je pense qu’on peut récupérer n’importe quel info mais commander c’est une autre étapeBon j’ai changé de stratégie car il faut que je comprenne comment faire un plugin jeedom.
Du coup, j’ai créé un docker sur mon nas synology qui remonte l’info sur mon serveur mosquitto MQTT et je récupère l’info dans jeedom.
Je pense qu’on peut récupérer n’importe quel info mais commander c’est une autre étape


ici c’est dans jeedom mais le principe est de passer par MQTT c’est plus simple

Je n’arrive pas à le rendre public, je ne trouve pas l’option :grin:

Mon objectif dans l’immédiat n’est pas de commander mais d’avoir les remontées dans HA pour ne plus passer par leur application mais uniquement HA.
Tu fais comment pour obtenir tes valeurs ? Tu utilises le websocket ?

pour electroliseur epool tu as deux topic l un via un module rs485 Électrolyseur Pool Technologie via le port RS485 (Justsalt, Ibaregul Duo...) - #71 par Pierre_Brdn

ou sinon directement via le Bluetooth intégrée à l electroliseur Electrolyseur E-Pool Technologie Justsalt - #285 par Fred_46726564

ça marche très bien c’est ha en fait qui remplace le pool comand juste avec l’ajout d un relais din pour piloter la.pompe

Voici mon code python qui donne la température en remonté d’info et je travaille sur la récupération de l’état de la lampe

"""
Indygo Light Controller – GUI simplifiée sans login à l'écran
--------------------------------------------------------------
• Connexion automatique avec identifiants intégrés
• Affichage température piscine et lumière (scraping)
• Actualisation automatique toutes les 60 secondes

Dépendances : requests, beautifulsoup4, customtkinter
"""

import threading, requests, re, time, customtkinter as ctk
from bs4 import BeautifulSoup

# ──────────────────────────────────────────────────────────────
# 1) Contrôleur HTTP Indygo
# ──────────────────────────────────────────────────────────────
class IndygoController:
    BASE_URL  = "https://myindygo.com"
    LOGIN_URL = f"{BASE_URL}/login"
    POOL_URL  = f"{BASE_URL}/pools/VOTRE ID MYINDYGO"
    # ⚠️ ID à adapter si besoin : ici on teste "Station 1"
    LIGHT_ID = "l'id de la light"

    def __init__(self):
        # ⚠️ Identifiants à remplacer si besoin
        self.email = "votre login"
        self.pwd   = "votre mot de passe"
        self.session = None
        self.csrf = None
        self.logged = False

    def _new_session(self):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0",
            "Accept": "text/html,application/xhtml+xml",
            "Accept-Language": "fr-FR,fr;q=0.9"
        })

    def _extract_tokens(self, html: str):
        soup = BeautifulSoup(html, "html.parser")
        meta = soup.find("meta", attrs={"name": re.compile("csrf|_token", re.I)})
        if meta:
            self.csrf = meta.get("content")

    def login(self) -> bool:
        self._new_session()
        try:
            r = self.session.get(self.LOGIN_URL, timeout=10)
            r.raise_for_status()
            self._extract_tokens(r.text)
            data = {"email": self.email, "password": self.pwd, "_token": self.csrf}
            r2 = self.session.post(self.LOGIN_URL, data=data, timeout=10, allow_redirects=True)
            self.logged = (r2.url != self.LOGIN_URL)
        except Exception as e:
            print("Erreur login:", e)
            self.logged = False
        return self.logged

    def fetch_temperature(self) -> str | None:
        if not self.logged:
            return None
        try:
            html = self.session.get(self.POOL_URL, timeout=10).text
            soup = BeautifulSoup(html, "html.parser")
            t = soup.find("div", class_="water_temperature_value")
            if t and t.span:
                return t.span.text.strip()
        except Exception as e:
            print("Erreur température:", e)
        return None

    def fetch_light_status(self) -> str | None:
        if not self.logged:
            return None
        try:
            html = self.session.get(self.POOL_URL, timeout=10).text
            soup = BeautifulSoup(html, "html.parser")

            # Identifier la section "Éclairage"
            light_section = soup.find("div", class_="title", string=re.compile("Éclairage", re.I))
            if not light_section:
                return "NON TROUVÉ"
            
            parent_div = light_section.find_parent("div", class_=re.compile("smallbox"))
            if not parent_div:
                return "NON TROUVÉ"

            # Chercher l’input radio actif
            input_active = parent_div.find("input", class_=re.compile("active"))
            if input_active:
                value = input_active.get("value", "INCONNU")
                return value.upper()
            else:
                return "NON TROUVÉ"
        except Exception as e:
            print(f"⚠️ Erreur fetch_light_status : {e}")
            return None
# ──────────────────────────────────────────────────────────────
# 2) Interface CustomTkinter simplifiée
# ──────────────────────────────────────────────────────────────
class IndygoApp(ctk.CTk):
    def __init__(self):
        super().__init__()
        ctk.set_appearance_mode("light")
        self.title("Indygo – Température Piscine")
        self.geometry("400x220")
        self.resizable(False, False)

        self.ctrl = IndygoController()
        self.temp_lbl = ctk.CTkLabel(self, text="Température : -- °C", font=("Segoe UI", 24, "bold"))
        self.temp_lbl.pack(pady=30)

        self.light_lbl = ctk.CTkLabel(self, text="Lumière : --", font=("Segoe UI", 18))
        self.light_lbl.pack(pady=10)

        self.status_lbl = ctk.CTkLabel(self, text="Connexion en cours…")
        self.status_lbl.pack(pady=10)

        self.after_id = None
        threading.Thread(target=self._init_task, daemon=True).start()

    def _init_task(self):
        if self.ctrl.login():
            self.status_lbl.configure(text="✅ Connecté")
            self._refresh_loop()
        else:
            self.status_lbl.configure(text="❌ Connexion échouée")

    def _refresh_loop(self):
        threading.Thread(target=self._refresh_task, daemon=True).start()

    def _refresh_task(self):
        temp = self.ctrl.fetch_temperature()
        light = self.ctrl.fetch_light_status()

        self.temp_lbl.configure(text=f"Température : {temp} °C" if temp else "Température : Erreur")
        self.light_lbl.configure(text=f"Lumière : {light}" if light else "Lumière : Erreur")

        self.after_id = self.after(60000, self._refresh_loop)

    def on_closing(self):
        if self.after_id:
            self.after_cancel(self.after_id)
        self.destroy()

# ──────────────────────────────────────────────────────────────
# 3) Lancement
# ──────────────────────────────────────────────────────────────
if __name__ == "__main__":
    print("Lancement OK")
    app = IndygoApp()
    app.protocol("WM_DELETE_WINDOW", app.on_closing)
    app.mainloop()

1 « J'aime »

Bonjour

Je reviens sur ce post que j’avais lancé, et je constate avec plaisir que des personnes bien plus douées que moi, ont avancés sur le sujet. :+1:

@B_Leq avez vous avancé depuis votre dernier post?

Bonjour à tous

Je vais m’équiper en électrolyseur Pool technologie avec le boitier “pool command Indygo” et l’antenne Lora, donc intéressé également par ce qui peut se passer en terme d’intégration pour ces matériels.