Hello,
Je travaille en ce moment sur l’intégration d’une piscine dont la filtration est gérée par indygo / pool command.
Il consiste en 2 modules, une centrale qui ressemble beaucoup à du matériel produit par CGE ( ipx800) et une passerelle Lora Wifi.
On retrouve les infos et commande de tout ce beau monde sur un cloud avec une page web pour afficher les infos et les commandes. Jusque la rien d’impossible.
Entreprise française , Je les ai contacté pour savoir s’il y avait une API cloud , ou bien une façon de récupérer des infos en local via un Mqtt ou autre.
Réponse sans appel : Non , aucunement et aucun projet dans ce sens.
Chose un peu dommage et étrange,sachant qu’il n’y a aucune interface de gestion en local, juste le module et la page cloud. En gros la boite se plante —> toutes les piscines sont à l’arrêt…
Bref et soit, le module est déjà installé donc je vais quand même essayer de récupérer des infos, voir des commandes.
Est ce que l’un de vous a déjà effectué ce genre de bricolage ? genre aller faire un polling sur une page web pour récupérer des infos?
J’ai une installation similaire (indygo / pool command) fraîchement installé et un serveur Jeedom initié il y a 6 mois. Mon expérience est (encore) faible sur les 2 plans, mais si vous avez besoin d’un beta testeur… je peux et veux bien aider.
Précision j’utilise l’application MyIndygo actuellement et me dit qu’il doit être possible de faire comme pour d’autre PlugIn, à savoir récupérer les infos et commandes après authentification avec le compte de l’appli…
Mais je ne sais pas par où commencer.
salut je me suis penché sur le truc ces derniers jour du coup avec un script python j’arrive a avoir les infos
#!/usr/bin/python3
import requests
import json
from bs4 import BeautifulSoup
import sys
import os # Ajout pour utiliser les variables d'environnement
# --- Configuration ---
# Il est fortement recommandé d'utiliser des variables d'environnement
# Pour les définir : export MYINDYGO_USER="votre_email"
# export MYINDYGO_PASS="votre_mot_de_passe"
# URL à vérifier en inspectant le trafic réseau de votre navigateur
LOGIN_URL = "https://myindygo.com/login" # Supposition, à vérifier !
DATA_URL = "https://myindygo.com/pools/662e88c3f398d029c4630ba6" # URL de la page avec les données
# Récupération sécurisée des identifiants depuis les variables d'environnement
USERNAME = os.getenv("MYINDYGO_USER", "myemail@gmail.com")
PASSWORD = os.getenv("MYINDYGO_PASS", "mypassword")
def login_to_myindygo():
"""Tente de se connecter à myindygo.com et retourne une session authentifiée."""
session = requests.Session()
try:
# Les noms des champs ('email', 'password') doivent correspondre au formulaire du site.
payload = {
'email': USERNAME,
'password': PASSWORD,
# Un jeton CSRF pourrait être nécessaire ici.
}
print("Envoi de la requête de connexion...")
login_response = session.post(LOGIN_URL, data=payload)
login_response.raise_for_status()
# Vérification si la connexion a réussi.
# La meilleure méthode est de vérifier l'URL de redirection ou le contenu de la page.
if login_response.url == LOGIN_URL or "mot de passe incorrect" in login_response.text:
print("Échec de la connexion. Vérifiez les identifiants, l'URL de login et les noms des champs du payload.")
return None
print("Connexion réussie !")
return session
except requests.exceptions.RequestException as e:
print(f"Une erreur réseau est survenue lors de la connexion : {e}")
return None
def get_pool_data(session):
"""Utilise la session pour récupérer et analyser les données de la piscine."""
if not session:
print("La session n'est pas valide.")
return None
try:
print(f"Récupération des données depuis : {DATA_URL}")
response = session.get(DATA_URL)
response.raise_for_status()
# Analyse du HTML de la page avec BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# --- Extraction des données ---
# Ces sélecteurs sont des EXEMPLES et doivent être adaptés à votre page.
# Utilisez l'inspecteur de votre navigateur pour trouver les bons.
temperature_element = soup.find('div', class_='water_temperature_value').find('span', class_='value')
ph_element = soup.find('div', {'id': 'ph-mano-value'})
redox_element = soup.find('div', {'id': 'redox-mano-value'})
# Extraction du texte et nettoyage
temperature = temperature_element.text.strip() if temperature_element else "N/A"
ph = ph_element.text.strip() if ph_element else "N/A"
redox = redox_element.text.strip() if redox_element else "N/A"
# Création d'un dictionnaire avec les données
data = {
"temperature": temperature,
"ph": ph,
"redox": redox,
}
return data
except requests.exceptions.RequestException as e:
print(f"Erreur lors de la récupération des données : {e}")
return None
except Exception as e:
print(f"Une erreur inattendue est survenue lors de l'analyse des données : {e}")
return None
if __name__ == "__main__":
if USERNAME == "votre_email_par_defaut_ici" or PASSWORD == "votre_mdp_par_defaut_ici":
print("ERREUR : Veuillez configurer vos identifiants via les variables d'environnement MYINDYGO_USER et MYINDYGO_PASS.")
sys.exit(1)
authenticated_session = login_to_myindygo()
if authenticated_session:
pool_data = get_pool_data(authenticated_session)
if pool_data:
print("\nDonnées récupérées avec succès (format JSON pour Jeedom) :")
# Affiche le JSON sur une seule ligne, pratique pour les scripts
print(json.dumps(pool_data))
et je retrouve ca dans les logs
0405|[2025-06-15 16:02:13] DEBUG Exécution de : sudo chmod +x /var/www/html/plugins/script/data/indigo_scraper.py 2>/dev/null;python /var/www/html/plugins/script/data/indigo_scraper.py => Envoi de la requête de connexion...
0406|Connexion réussie !
0407|Récupération des données depuis : https://myindygo.com/pools/662e88c3f398d029c4630ba6
0408|Données récupérées avec succès (format JSON pour Jeedom) :
0409|{"temperature": "29.9", "ph": "8", "redox": "665"}
bon voila j’ai réussi a avoir les infos température, PH et Redox .
#!/usr/bin/python3
import requests
import json
from bs4 import BeautifulSoup
import sys
import os
# --- Configuration ---
LOGIN_URL = "https://myindygo.com/login"
DATA_URL = "https://myindygo.com/pools/monid"
USERNAME = os.getenv("MYINDYGO_USER", "myemail@gmail.com")
PASSWORD = os.getenv("MYINDYGO_PASS", "mypassword")
def login_to_myindygo():
"""Tente de se connecter à myindygo.com et retourne une session authentifiée."""
session = requests.Session()
try:
payload = {
'email': USERNAME,
'password': PASSWORD,
}
login_response = session.post(LOGIN_URL, data=payload)
login_response.raise_for_status()
if login_response.url == LOGIN_URL or "mot de passe incorrect" in login_response.text:
# print("Échec de la connexion. Vérifiez les identifiants, l'URL de login et les noms des champs du payload.")
return None
return session
except requests.exceptions.RequestException as e:
# print(f"Une erreur réseau est survenue lors de la connexion : {e}")
return None
def get_pool_data(session):
"""Utilise la session pour récupérer et analyser les données de la piscine."""
if not session:
# print("La session n'est pas valide.")
return None
try:
response = session.get(DATA_URL)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# --- Extraction des données ---
# Ces sélecteurs sont des EXEMPLES et doivent être adaptés à votre page.
temperature_element = soup.find('div', class_='water_temperature_value')
ph_element = soup.find('div', {'id': 'ph-mano-value'})
redox_element = soup.find('div', {'id': 'redox-mano-value'})
# Extraction du texte et nettoyage, en gérant les cas où l'élément n'est pas trouvé
temperature_text = temperature_element.find('span', class_='value').text.strip() if temperature_element and temperature_element.find('span', class_='value') else "N/A"
ph_text = ph_element.text.strip() if ph_element else "N/A"
redox_text = redox_element.text.strip() if redox_element else "N/A"
pool_data = {
"temperature": temperature_text,
"ph": ph_text,
"redox": redox_text,
}
return pool_data
except requests.exceptions.RequestException as e:
# print(f"Erreur lors de la récupération des données : {e}")
return None
except Exception as e:
# print(f"Une erreur inattendue est survenue lors de l'analyse des données : {e}")
return None
if __name__ == "__main__":
if USERNAME == "myemail@gmail.com" or PASSWORD == "mypassword":
# Jeedom ne devrait pas afficher cette erreur, la configuration est censée être faite via l'OS.
# sys.exit(1) # Ne pas quitter ici, mais retourner une erreur ou "N/A"
pass # Laisser passer pour que le script puisse s'exécuter même avec les valeurs par défaut, Jeedom gérera l'absence de valeur.
if len(sys.argv) > 1:
requested_data = sys.argv[1] # L'argument passé au script (ex: "temperature")
authenticated_session = login_to_myindygo()
if authenticated_session:
pool_data = get_pool_data(authenticated_session)
if pool_data:
if requested_data in pool_data:
print(pool_data[requested_data])
else:
print("N/A") # Ou une autre valeur par défaut pour Jeedom
else:
print("N/A") # Si aucune donnée n'est récupérée
else:
print("N/A") # Si la connexion échoue
else:
# Comportement par défaut si aucun argument n'est fourni (optionnel, mais utile pour le debug)
print("Veuillez spécifier le type de donnée à récupérer (ex: temperature, ph, redox).")
sys.exit(1)