Besoin d'aide récupération d'info sur site web "Scrape"

OK donc je comprends que tu n’as pas un JSON à la fin de l’appel de l’url.
Mets des logs et regarde ce que ça donne

logger:
  default: info
  logs:
    homeassistant.components.rest: debug

Effectivement il y a bien un probleme d’authentification. Il cherche l’info « puissance » sur la page de connexion…

2022-11-16 10:53:37.589 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'value_json' is undefined when rendering '{{ value_json|truncate(200, True) }}'
2022-11-16 10:53:40.944 WARNING (MainThread) [custom_components.xiaomi_miot.binary_sensor] Capteur Porte Entrée(lumi.sensor_magnet.v2): Get miio data failed: None
2022-11-16 10:53:42.511 DEBUG (MainThread) [homeassistant.components.rest.data] Updating from https://mon.projet-tbh.fr/energie/tableau-de-bord
2022-11-16 10:53:42.597 DEBUG (MainThread) [homeassistant.components.rest.sensor] Data fetched from resource: 


<!DOCTYPE html>
<html lang="">

    <head>
        <meta charset="UTF-8">
        
        <meta name = "description" content = "Le tableau de bord de l'habitat vous apprend à maîtriser vos consommations d'énergie" >
        
        <meta name = "keywords" content = "tableau de bord, habitat, consommations, énergie, tbh" >
        <meta name = "viewport" content = "width = device-width" >
        
        <title>Quarthome-Connexion</title>

        <link rel="shortcut icon" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/images/favicon.png" />
        <link rel="icon" type = "image/x-icon" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/images/quarthome/favicon.png" >
        <link rel="icon" type="image/png" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/images/quarthome/favicon.png" />
        <link rel="apple-touch-icon" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/images/quarthome/favicon.png" >
        
        <link rel="stylesheet" type="text/css" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/css/style.css" />
        
        <!--[if IE]>
        <link rel="stylesheet" type="text/css" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/css/ie.css" />
        <![endif]-->  
        <script src="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/js/jquery-2.1.1.min.js"></script>
        <script src="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/js/main.js"></script>
        <script type="text/javascript" src="/jsi18n/"></script>
        
        
        <link rel="stylesheet" type="text/css" href="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/css/quarthome.css" />
    </head>

    <body>
        <!--[if lt IE 9]>
            <div class="alert alert-warning"><strong>Votre navigateur n'est pas à jour</strong>. Il est nécessaire de le <a href="http://browsehappy.com/">mettre à jour</a> pour visualiser correctement ce site internet.</div>
		<![endif]--> 
        <section id="body">
            <section id="main-section-login">
                
                
    <div class="login">
        <h1><img src="https://storage.gra.cloud.ovh.net/v1/AUTH_e6d38580116f483bbf425f9d3668c44c/quarthome_static/images/quart_home_logo.png" alt="Connexion"/></h1>
        

        <form method="post" action="/accounts/login/">
            <input type='hidden' name='csrfmiddlewaretoken' value='KAAiiMtMWlSlWFMZKKu4I86p6FyxYa6TXlv3YXHBxa25qgOuuqx34v5RduvmVDwv' />
            <p>
                <label>Identifiant</label>
                <br/>
                <input type="text" name="username" autocapitalize="none" maxlength="254" required id="id_username" />
            </p>
            
            <p>
                <label>Mot de passe</label>
                <br/>
                <input type="password" name="password" required id="id_password" />
            </p>
            
            <div>
            <!-- <a class="right button gris" href="mon.quarthome.com//#inscription_panel">s'inscrire</a> -->
            <a class="right button gris red_bold" href="/mdp-oublie/">Mot de passe oublié</a>
            <input  type="submit" value='connexion' />
            </div>
            <input type="hidden" name="next" value="/energie/tableau-de-bord" />
            
        </form>
    </div>

            </section>
        </section>

    </body>

</html>

2022-11-16 10:53:42.597 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'value_json' is undefined when rendering '{{ value_json|truncate(200, True) }}'

il faut trouver la bonne méthode d’authentification

Bonjour @Pulpy-Luke
Effectivement… Je vais continuer à creuser, en espérant trouver.
Merci pour ton aide !

Bonjour à tous,

Je débute sur HA et je cherche à intégrer les commandes de mon visiophone hikvision 8113.
J’ai trouvé la solution pour récupérer l’état d’appel en rest depuis une commande curl :

curl -i --digest -u admin:xxxx http://192.168.1.XX/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform

rest:
  - resource: http://192.168.1.XX/ISAPI/VideoIntercom/callStatus?format=json
    scan_interval: 1 # the default is 30 seconds if you leave this line out, or change it to what you need.
    authentication: digest
    username: admin
    password: xxxx
    sensor:
      - name: "Doorbell Status"
        value_template: "{{ value_json.CallStatus.status }}"

Mais je n’arrive pas à faire fonctionner la sortie de foçage de l’ouverture porte depuis le curl fonctionnel dans putty suivant :

curl -i --digest -u admin:xxxx -X PUT -d '<RemoteControlDoor><cmd>open</cmd></RemoteControlDoor>' http://192.168.1.XX/ISAPI/AccessControl/RemoteControl/door/1

Si quelqu’un a de l’expérience dans ce genre de commande, ça m’aiderait beaucoup.
Merci à Pulpy-Luke pour l’aide, voici la solution pour la commande shell utilisable avec mon Hikvsion DS-KV8113-WME1(B) :

shell_command:
    portail_command: "curl -i --digest -u admin:xxxx -X PUT -d '<RemoteControlDoor><cmd>open</cmd></RemoteControlDoor>' http://192.168.1.XX/ISAPI/AccessControl/RemoteControl/door/1"

@bientôt et merci encore

Salut,

Un curl comme ça qui se balade au milieu d’une config YAML ça ne fonctionne pas, il faut passer par une config de commandline

Merci je teste ça, mon but était plutôt de convertir en rest mais si ça passe en command pourquoi pas.

Le rest, c’est bien quand tu as un retour (typiquement l’interrogation de l’état dans ton exemple).
Là tu n’as besoin que d’envoyer un ordre

C’est noté, ça fonctionne mais par intermittence, je ne sais pas trop ce qu’il se passe mais au moins ma commande vit.
J’investigue dans la semaine.

Merci beaucoup l’aide sur la commande line, désolé si la question était bête.

1 « J'aime »

Bonjour,
Je ne suis pas sûr d’etre au bon endroit avec les histoire de json. Donc si je me trompe, je m’excuse d’avance.
Je suis entrain d’essayer de récuperer avec scrape des infos du site EDF solution solaire. L’idée et de creer un sensor pour ma prod solaire (edf ne donne pas les codes du module enphase qui est automatiquement sur HA, mais c’est un autre debat). Voir photo (rond rouge sur ce que je veux)


.
Le soucis, c’est que j’ai bien recuperer la balise css avec web scraper, mais je ne recupére rien.
Dans scrape je fais quoi ? j’ai mis en capture la 1er page. Si je laisse « verifier le certificat SSL » coché, je n’arrive jamais à la 2e page.

Si je l’enleve, j’ai une suite, que je mets en photo aussi, mais je suis ici aussi bloquer pour remplir les champs (mise à part ce que j’ai mis !)

Merci d’avance.

Simon

Bonjour Simon, as-tu trouvé une solution ? Si oui je suis preneur avec des détails car je ne suis pas un expert.

Merci

Yoann

Bonsoir,
Non pas de solution… J’ai fini par acheter un petit wattmètre Zigbee que j’ai mis au niveau du tableau électrique…
C’est dommage de payer un truc en plus pour récupérer des données qui existent déjà, mais bon, EDF n’est pas coopérant sur ce coup !!

Bon journée.

Simon

Re, j’ai avancé sur le Scrape d’EDF via un script Python avec Selenium. En revanche ça ne fonctionnera pas sur HA directement. On peut essayer de le faire tourner sur un serveur pour envoyer les données à HA.
Mon script :

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 🔒 Identifiants
EMAIL = "login"
PASSWORD = "password"

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
service = Service("/usr/local/bin/chromedriver")

driver = webdriver.Chrome(service=service, options=chrome_options)

def accept_cookies(driver, timeout=5):
    try:
        # Essai avec le bouton classique
        cookie_button = WebDriverWait(driver, timeout).until(
            EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler"))
        )
        cookie_button.click()
        print("✅ Cookies acceptés")
    except:
        try:
            # Essai avec le bouton Didomi
            didomi_button = WebDriverWait(driver, timeout).until(
                EC.element_to_be_clickable((By.ID, "didomi-notice-agree-button"))
            )
            didomi_button.click()
            print("✅ Cookies acceptés via bouton 'didomi-notice-agree-button'")
        except:
            print("ℹ️ Pas de bouton cookie détecté ou déjà accepté")

def fermer_popup_depart(driver, timeout=5):
    try:
        WebDriverWait(driver, timeout).until(
            EC.presence_of_element_located((By.XPATH, "//*[contains(text(), \"C'est parti !\")]"))
        )
        bouton_depart = driver.find_element(By.XPATH, "//*[contains(text(), \"C'est parti !\")]")
        bouton_depart.click()
        print("✅ Popup 'C’est parti !' détectée")
    except:
        print("ℹ️ Aucun popup 'C’est parti !' détecté")

def fermer_popup_tutoriel(driver, timeout=5):
    try:
        bouton_fermer = WebDriverWait(driver, timeout).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@title='Fermer le tutoriel']"))
        )
        bouton_fermer.click()
        print("✅ Tutoriel fermé")
    except:
        print("ℹ️ Aucun bouton 'Fermer le tutoriel' trouvé ou déjà fermé")

try:
    driver.get("https://espaceclient.edf-solutions-solaires.com")

    accept_cookies(driver)

    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "signInName"))
    )

    driver.find_element(By.ID, "signInName").send_keys(EMAIL)
    driver.find_element(By.ID, "password").send_keys(PASSWORD)
    driver.find_element(By.ID, "next").click()
    print("✅ Connexion lancée...")

    time.sleep(5)
    accept_cookies(driver)

    fermer_popup_depart(driver)
    fermer_popup_tutoriel(driver)

    # ⬇️ Extraction des valeurs d'énergie
    valeurs = driver.find_elements(By.CLASS_NAME, "text-2xl")

    if len(valeurs) >= 6:
        def parse_kwh(valeur_str):
            return float(valeur_str.replace(",", ".").strip())

        production_solaire = parse_kwh(valeurs[1].text)
        energie_autoconsommee_1 = parse_kwh(valeurs[2].text)
        injection_reseau = parse_kwh(valeurs[3].text)
        consommation_reseau_1 = parse_kwh(valeurs[4].text)
        energie_autoconsommee_2 = parse_kwh(valeurs[5].text)
        consommation_reseau_2 = parse_kwh(valeurs[6].text)

        print("☀️ Production solaire :", production_solaire, "kWh")
        print("⚡ Énergie autoconsommée (1) :", energie_autoconsommee_1, "kWh")
        print("🔄 Injection réseau :", injection_reseau, "kWh")
        print("🔌 Consommation réseau (1) :", consommation_reseau_1, "kWh")
        print("⚡ Énergie autoconsommée (2) :", energie_autoconsommee_2, "kWh")
        print("🔌 Consommation réseau (2) :", consommation_reseau_2, "kWh")
    else:
        print("❌ Moins de 6 valeurs détectées avec la classe 'text-2xl'")

    time.sleep(5)

except Exception as e:
    print("❌ Erreur :", e)

finally:
    driver.quit()

En résultat j’ai :
:information_source: Pas de bouton cookie détecté ou déjà accepté
:white_check_mark: Connexion lancée…
:white_check_mark: Cookies acceptés via bouton ‹ didomi-notice-agree-button ›
:white_check_mark: Popup ‹ C’est parti ! › détectée
:white_check_mark: Tutoriel fermé
:sunny: Production solaire : 8.2 kWh
:zap: Énergie autoconsommée (1) : 6.6 kWh
:arrows_counterclockwise: Injection réseau : 1.6 kWh
:electric_plug: Consommation réseau (1) : 10.1 kWh
:zap: Énergie autoconsommée (2) : 6.6 kWh
:electric_plug: Consommation réseau (2) : 3.5 kWh

Après on doit pouvoir envoyer tout cela vers HA via un JSON mais j’ai laissé tombé car pas envie.

J’ai trouvé une autre solution pour récupérer les données de l’onduleur directmeent dans HA, je teste ce soir et posterai sur un autre forum si besoin.

Yoann

Une solution pour intégrer l’onduleur sous HA → Intégration de l'onduleur Huawei SUN2000 (EDF solution solaire sans compte installateur) dans Home Assistant via un routeur GL.iNet