Recuperer des valeurs sur une interface de gestion web?

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?

Merci d’avance.

Pas mal de plugin le font déjà, pour la météo par exemple

Je ne sais pas à quoi ressemble ta page mais bon avec un scénario et un bloc code tu peux y arriver !

Ce qui va bloquer a mon avis c’est l’auth… quoique.
Tu as des exemples de scenario?

Je peux mettre a dispo la page si quelqu’un veux regarder

@Foulek57 reviens nous de vacances !!! :rofl: :rofl: :rofl:

1 « J'aime »

Salut,

Le plugin Script parait tout indiqué non ?

Documentation Jeedom - Plugin Script : HTML

Permet de passer une page Web (fichier HTML) pour récupérer une valeur dessus.

2 « J'aime »

En effet, je ne l’avais pas vu sous cet angle… ( je m’en sert pour effectuer des curl/ heartbeat actuellement ) Je regarde ca attentivement.

1 « J'aime »

Faut faire du scraping :wink:

A voir, je veux bien t’aider mais je ne vais pas avoir beaucoup de temps ces prochains mois :slight_smile:

Bonjour,

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.

Bonjour,

Même situation: MyIndigo et Jeedom. Quelqu’un a-t-il avancé sur le sujet.
Aimerai pouvoir suivre ma piscine depuis Jeedom…

2 « J'aime »

Pour l’instant je n’absolument pas eu le temps de m’y mettre… une question de flemme clairement.

Bonjour,

Je remonte le post pour savoir s’il y a eu des MAJ depuis.

Egalement utilisateur de MyIndigo et Jeedom, ce serai chouette d’avoir une remontée des infos dans Jeedom.

Merci.

Intéressé également

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"}

pour traiter les données je pense qu’il faut créer un fichier json ou on peut les utiliser directement ?

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)