Problème pour stocker token dans une variable

Bonjour,

Mon problème

J’essaie depuis quelques semaines de récupérer les valeurs de la filtration de ma piscine (système klereo).
Klereo propose une interface web et j’arrivais auparavant à récupérer les informations depuis mon jeedom.
Le constructeur m’a envoyé le code à inclure dans le fichier configuration.yaml de HA mais j’ai un problème avec la récupération de la variable token.
Voici le code en question :

sensor:
  # Klereo Get jwt token (50mn)
  - platform: rest
    name: KlereoToken
    scan_interval: 3000
    resource: https://connect.klereo.fr/php/GetJWT.php
    method: POST
    headers:
      Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
    payload: "login=Fmau&password=b&version=391-H&app=Api"
    value_template: "{{ value_json.jwt }}"
    json_attributes:
      - jwt

Lorsque que je consulte les logs je vois bien que le payload fonctionne et qu’un token est récupéré mais lorsque que je vais dans outil de développement et que je veux consulter l’état de [sensor.klereotoken] il est vide.
Je ne suis pas très à l’aise avec le yaml et sur HA seulement depuis quelques mois.
Avez vous une idée du pourquoi le token ne vient pas ce stocker dans la variable ?

Merci d’avance,

Ma configuration


[center]## System Information

version core-2024.5.5
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.2
os_name Linux
os_version 6.6.29-haos
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.34.0
Stage running
Available Repositories 1396
Downloaded Repositories 9
HACS Data ok
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 12.3
update_channel stable
supervisor_version supervisor-2024.05.1
agent_version 1.6.0
docker_version 25.0.5
disk_total 30.8 GB
disk_used 8.2 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.14.0), Samba share (12.3.1), Studio Code Server (5.15.0), Mosquitto broker (6.4.1), tydom2mqtt (3.4.3), Let’s Encrypt (5.0.18), Z-Wave JS (0.5.0), PSA Car Controller (v3.5.1), Samba Backup (5.2.0)
Dashboards
dashboards 3
resources 1
views 9
mode storage
Recorder
oldest_recorder_run 29 mai 2024 à 15:58
current_recorder_run 29 mai 2024 à 17:58
estimated_db_size 180.54 MiB
database_engine sqlite
database_version 3.44.2
[/center]

Salut

J’aurais tendance à dire que tu devrais mettre ça :

sensor:
  # Klereo Get jwt token (50mn)
  - platform: rest
    name: KlereoToken
    scan_interval: 3000
    resource: https://connect.klereo.fr/php/GetJWT.php
    method: POST
    headers:
      Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
    payload: "login=Fmau&password=b&version=391-H&app=Api"
    value_template: "{{ value_json }}"
    json_attributes:
      - jwt

J’ai enlevé ‹ jwt › dans value_template

Le plus simple pour te répondre, ç’est que tu mettes dans un navigateur cette url : https://connect.klereo.fr/php/GetJWT.php?login=Fmau&password=b&version=391-H&app=Api
avec le bon login et password.
Et tu nous montre la structure de la réponse.

2 « J'aime »

Bonjour et merci pour ta réponse.
J’ai changé le code en enlevant jwt mais ce n’est pas mieux.
Dans les logs je vois bien qu’il arrive à récuperer un token pourtant

2024-06-06 09:33:15.137 DEBUG (MainThread) [homeassistant.components.rest.data] Data fetched from resource: {"status":"error","detail":"La connexion n'est plus valide"}
2024-06-06 09:33:15.140 DEBUG (MainThread) [homeassistant.components.rest.data] Data fetched from resource: {"status":"error","detail":"La connexion n'est plus valide"}
2024-06-06 09:33:15.142 DEBUG (MainThread) [homeassistant.components.rest.data] Data fetched from resource: {"status":"ok","token":"montoken","access":10,"histoAccess":8194,"cgAccepted":1,"jwt":"eyJhbGciOiAiSFMyNTYiLCJ0eXAiOiADTk0LCJ2ZXIiOiIzOTEtSCJ9.Dm-xP1J2XTMQU1M3ZTXH0ofqpKqiCqV1GDXEXFdfdb0","notify":"OLDVERSION","id":6446}
2024-06-06 09:33:15.143 ERROR (MainThread) [homeassistant.helpers.entity] Failed to set state for sensor.klereotoken, fall back to unknown
Traceback (most recent call last):

Par contre lorsque j’essaie avec le navigateur j’ai une erreur, pourtant j’ai bien formaté la requete avec mon login et le token qui est utilisé dans HA :
image

Merci d’avance

Essaie ça :

sensor:
  # Klereo Get jwt token (50mn)
  - platform: rest
    name: KlereoToken
    scan_interval: 3000
    resource: https://connect.klereo.fr/php/GetJWT.php
    method: POST
    headers:
      Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
    payload: "login=Fmau&password=b&version=391-H&app=Api"
    value_template: "{{ value_json.token }}"

Ca a l’air mieux, j’ai bien la valeur dans attributs

Mais ne semble pas suffisant pour que les autres sensor puissent récuperer les valeurs.
Problème de format ?
Le sensor après obtention du token est celui là :

  # Klereo Get pool list, extract sensor0
  - platform: rest
    name: KlereoSensor0
    scan_interval: 300
    resource: https://connect.klereo.fr/php/GetIndex.php
    headers:
      Authorization: Bearer {{ state_attr('sensor.klereotoken', 'jwt') }}
    json_attributes:
      - status
    value_template: "{{ value_json.response[0].probes[0].filteredValue }}"
    unit_of_measurement: "°C"

Je suis allé un peu vite dans ma réponse j’ai des valeurs qui commencent à remonter tranquillement.
Je vous fait un retour dans la matinée.
Merci beaucoup !

Le script fonctionne depuis ce matin et je remonte bien les valeurs de températures et de filtration.
Merci beaucoup pour ton aide sur le sujet.
J’avoue ne pas trop comprendre pourquoi il fallait mettre token et pas jwt vu que c’était la variable que je voulais récupérer.

Du coup j’ai un script fonctionnel pour le système Klereo sur HA pour ceux qui passent sur ce forum avec ce besoin.

1 « J'aime »

Bonjour,

Je suis preneur pour le script pour les remontées KLETEO .

Merci

erreur : KLEREO
Merci

# Liste des capteurs REST
sensor:
  # Klereo Get jwt token (50mn)
  - platform: rest
    name: KlereoToken
    scan_interval: 3000
    resource: https://connect.klereo.fr/php/GetJWT.php
    method: POST
    headers:
      Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
    payload: "login=TONLOGIN&password=SHA1ENCRYPTEDPASSWORD&version=391-H&app=Api"
    value_template: "{{ value_json.token }}"
    json_attributes:
      - jwt

  # Klereo Get pool list, extract sensor0
  - platform: rest
    name: KlereoSensorTemperature
    scan_interval: 300
    resource: https://connect.klereo.fr/php/GetIndex.php
    headers:
      Authorization: Bearer {{ state_attr('sensor.klereotoken', 'jwt') }}
    json_attributes:
      - status
    value_template: "{{ value_json.response[0].probes[0].filteredValue }}"
    unit_of_measurement: "°C"

votre mot de passe à la place du champ SHA1ENCRYPTEDPASSWORD
Attention le SHA1ENCRYPTEDPASSWORD correspond à votre mot de passe encrypté par algorithme SHA1.

Bonjour,

Merci pour le script , j’ai fait un copier coller et je n’ai que la température extérieure qui remonte?

Bonjour,

Oui dans ce script je récupère seulement la température du bassin.
Pour les autres valeurs il faut changer la valeur de probes.
A tester les différentes valeurs pour avoir les correspondances.

Je viens de tester les valeurs de probes.
C’est 17 et 18 pour le PH et Redox.


  # Klereo Get pool list, extract sensor0
  - platform: rest
    name: KlereoSensorTemperature
    scan_interval: 300
    resource: https://connect.klereo.fr/php/GetIndex.php
    headers:
      Authorization: Bearer {{ state_attr('sensor.klereotoken', 'jwt') }}
    json_attributes:
      - status
    value_template: "{{ value_json.response[0].probes[0].filteredValue }}"
    unit_of_measurement: "°C"

  # Klereo Get pool list, extract sensor0
  - platform: rest
    name: KlereoPH
    scan_interval: 300
    resource: https://connect.klereo.fr/php/GetIndex.php
    headers:
      Authorization: Bearer {{ state_attr('sensor.klereotoken', 'jwt') }}
    json_attributes:
      - status
    value_template: "{{ value_json.response[0].probes[17].filteredValue }}"
    unit_of_measurement: "PH"

  # Klereo Get pool list, extract sensor0
  - platform: rest
    name: KlereoRedox
    scan_interval: 300
    resource: https://connect.klereo.fr/php/GetIndex.php
    headers:
      Authorization: Bearer {{ state_attr('sensor.klereotoken', 'jwt') }}
    json_attributes:
      - status
    value_template: "{{ value_json.response[0].probes[18].filteredValue }}"
    unit_of_measurement: "PPm"

Bonjour
Merci beaucoup thxmono pour ces grosses avancées !!
J’ai modifié le script pour n’avoir qu’un seul appel pour tous les capteurs et gérer quand la valeur n’est pas correctement récupéré
merci encore !

  # Klereo Get pool data (one API call for all sensors)
  - platform: rest
    name: KlereoPoolData
    scan_interval: 300
    resource: https://connect.klereo.fr/php/GetIndex.php
    headers:
      Authorization: Bearer {{ state_attr('sensor.klereotoken', 'jwt') }}
    json_attributes:
      - response
    value_template: "{{ value_json.status }}"

  # Capteurs de température, pH, Redox et filtration basés sur les données récupérées par KlereoPoolData
  - platform: template
    sensors:
      klereo_temperature_air:
        friendly_name: "Température de l'air"
        unit_of_measurement: "°C"
        value_template: >-
          {% if state_attr('sensor.klereopooldata', 'response') is not none %}
            {{ state_attr('sensor.klereopooldata', 'response')[0].probes[0].filteredValue }}
          {% else %}
            -1
          {% endif %}
      klereo_temperature_eau:
        friendly_name: "Température de l'eau"
        unit_of_measurement: "°C"
        value_template: >-
          {% if state_attr('sensor.klereopooldata', 'response') is not none %}
            {{ state_attr('sensor.klereopooldata', 'response')[0].probes[1].filteredValue }}
          {% else %}
            -1
          {% endif %}
      klereo_ph:
        friendly_name: "pH de l'eau"
        unit_of_measurement: "pH"
        value_template: >-
          {% if state_attr('sensor.klereopooldata', 'response') is not none %}
            {{ state_attr('sensor.klereopooldata', 'response')[0].probes[2].filteredValue }}
          {% else %}
            0
          {% endif %}
      klereo_redox:
        friendly_name: "Redox"
        unit_of_measurement: "mV"
        value_template: >-
          {% if state_attr('sensor.klereopooldata', 'response') is not none %}
            {{ state_attr('sensor.klereopooldata', 'response')[0].probes[3].filteredValue }}
          {% else %}
            0
          {% endif %}

Merci pour les évolutions. N’ayant pas de compétences de développement je n’avais pas pris le risque de faire des modifications.
Si ca peut t’intéresser il est possible de remonter l’état de la filtration et des éclairages également (et de les modifier sans doute).
Ci-dessous le code utilisé sous Jeedom, je ne sais pas comment l’adapter sur HA.

// Fetch data from outs array...
foreach($rep[0]['outs'] as &$out){
	if($out['index']==0){
      	$lightState=$out['status'];
		//cmd::byString("#[Grisy][Klereo][Light_Klereo]#")->event($lightState);
		$scenario->setLog("Eclairage: ".$lightState);
    	}
    else if($out['index']==1){
      	$pumpState=$out['status'];
		//cmd::byString("#[Grisy][Klereo][Pump_Klereo]#")->event($pumpState);
		$scenario->setLog("Filtration: ".$pumpState);
    	}
    }



// **************************************************
// 4: Eclairage Timer On  example.....
// **************************************************/
/*
curl_setopt($ch, CURLOPT_URL, $serverRoot.'/SetOut.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
  'poolID' => $poolID,
  'outIdx' => 0,					// Light output
  'newMode' => 2,					// Timer mode
  'newState' => $currentState,		// On	
  'comMode' => 1,
  ));
$page_content = curl_exec($ch);
if (curl_error($ch)) {
	$scenario->setLog('CurlError: '.curl_error($ch));
  	return;
	}
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code != 200){
	$scenario->setLog('Erreur: '. $http_code);
	return;
	}
$scenario->setLog('Réponse: '. $page_content);
$cmdres = json_decode($page_content,true);

$scenario->setLog("Status: ".$cmdres['status']);
$rep=$cmdres['response'];
$scenario->setLog("cmdID: ".$rep[0]['cmdID']);
$scenario->setLog("poolID: ".$rep[0]['poolID']);
*/