Extraction d'un attribut dans l'attribut

Mon problème

bonjour les amis,
j’ai un soucis de programmation que mon ami chat GPT ne sait pas résoudre (il n’est pas très bon, comme moi, en jinja2).

Je dispose d’un deshumidificateur électrique compatible HA au nom barbare de humidifier.a1_8048 dont les attributs sont les suivants

min_humidity: 35
max_humidity: 85
available_modes:
  - Set
  - Smart
  - Continuous
  - Dry
humidity: 35
mode: Set
last_error_code: 0
last_error_time: '2023-09-02T10:48:23.815923'
capabilities: '{''fan_speed'': 7, ''auto'': 1, ''dry_clothes'': 1}'
capabilities_data: b503100201071f02010120020101cb5c
error_code: 0
last_data: c80101507f7f002300000000000000002a62000000004bf035
device_class: dehumidifier
friendly_name: Deshumidificateur
supported_features: 1s

j’aurais souhaité extraire la valeur du fan_speed (donc obtenir le chiffre 7)

chatGPT m’a fait des propositions qui me semblaient bonnes :

{% set capabilities_json = state_attr('humidifier.a1_8048', 'capabilities') | from_json %}
{% set fan_speed = capabilities_json.fan_speed %}

mais hélas j’ai le message JSONDecodeError: unexpected character: line 1 column 2 (char 1)

Avez vous une idée ?

Bonjour,
tu veut avoir la valeur de l’attribut pour faire quoi ?

Pour afficher une information sur la vitesse de ventilation

Solution rapide mais pas final. On te proposera mieux :wink:
@Pulpy-Luke doit savoir :stuck_out_tongue:

{{ state_attr('humidifier.a1_8048', 'capabilities') | replace('{''fan_speed'':,"") | replace(", ''auto'': 1, ''dry_clothes'': 1}'", "") }}

Merci pour la reponse,

en l’état le code ne marche pas mais je vais m’en inspirer pour essayer de trouver une solution

Cordialement

Salut @merguez07

Le code suivant donne quoi, dans les outils de dev ?

{{ state_attr('humidifier.a1_8048', 'capabilities')['fan_speed'] }}

Merci de te pencher sur le problème. ça donne

UndefinedError: 'str object' has no attribute 'fan_speed'

Et ca ?

{{ state_attr('humidifier.a1_8048', 'capabilities') | map(attribute='fan_speed') }}

Et ça ?

{% set data_str = state_attr('humidifier.a1_8048', 'capabilities') %}
{% set data = data_str | from_json %}
{{ data['fan_speed'] }}

j’ai corrigé l’apostrophe manquante

{{ state_attr('humidifier.a1_8048', 'capabilities') | replace('{''fan_speed'':,""') | replace(", ''auto'': 1, ''dry_clothes'': 1}'", "") }}

mais pour autant j’ai le message d’erreur suivant :

`TypeError: do_replace() missing 1 required positional argument: 'new'`

là j’ai le message

<generator object sync_do_map at 0x7f6fc9ec40>

là j’ai le message

JSONDecodeError: unexpected character: line 1 column 2 (char 1)

il faut décomposer (parce que du yaml avec du json c’est pas courrant) à chaque étape :
{{ variable }}

Peut-être ça :

{% set data_str = state_attr('humidifier.a1_8048', 'capabilities') | replace("''", '"') | trim("'") %}
{% set data = data_str | from_json %}
{{ data['fan_speed'] }}

j’ai toujours le message

JSONDecodeError: unexpected character: line 1 column 2 (char 1)

Il a vraiment du mal avec le json

tu peux juste nous donner le résultat de :

{{ state_attr('humidifier.a1_8048', 'capabilities') }}

Dans les outils de dev

1 « J'aime »
{
  "fan_speed": 7,
  "auto": 1,
  "dry_clothes": 1
}

Alors comme c’est déjà un json

{% set data = state_attr('humidifier.a1_8048', 'capabilities') %}
{{ data.fan_speed }}

malheusement avec ce code j’ai l’erreur

UndefinedError: 'str object' has no attribute 'fan_speed'

j’ai réussi avec le code

{{ state_attr('humidifier.a1_8048', 'capabilities') }}
{% set vitesse = state_attr('humidifier.a1_8048', 'capabilities') %}
{% set vitesse = vitesse.replace('{\'fan_speed\': ',"") %}
{% set vitesse = vitesse.split(',')[0] %}
{{vitesse}}

ou le code

{% set vitesse = state_attr('humidifier.a1_8048', 'capabilities') | regex_findall_index("\d+") %}
{{ vitesse[0] if vitesse else '' }}

ça on dirait un format pourri dans le json. 2 quotes simples '' au lieu d’une double quote "