Couper un morceau de chaine et le mettre dans une variable

Bonjour,

Je suis en train d’essayer d’extraire des chiffres d’une chaine pour les mettre dans une variable mais je bloque. Pourrais je avoir un coup de main svp?

Voici mes tests :

{{ states('var.deebot_pieces') }}
{{ states('var.deebot_pieces').count(':') }}

{{ states('var.deebot_pieces').split(',') }}
{{ states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace("'",'') }}

{{ states('var.deebot_pieces').split(',') [0] |replace('{','') |replace('}','') |replace("'",'') }}
{{ states('var.deebot_pieces').split(',') [1] |replace('{','') |replace('}','') |replace("'",'') }}
{{ states('var.deebot_pieces').split(',') [2] |replace('{','') |replace('}','') |replace("'",'') }}
{{ states('var.deebot_pieces').split(',') [3] |replace('{','') |replace('}','') |replace("'",'') }}

{{ states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace("'",'') }}

{{ ( states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace("'",'') ).find('dining_room') }}
{{ ( states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace("'",'') ).find('kitchen') }}
{{ ( states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace("'",'') ).find('vestiaire1') }}
{{ ( states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace("'",'') ).find('lounge') }}

{{ ( states('var.deebot_pieces').split(',') |replace('{','') |replace('}','') |replace('[','') |replace(']','') |replace('"','') |replace("'",'') )  }}

Voici le résultat:

{'dining_room': 0, 'kitchen': 1, 'vestiaire1': 13, 'lounge': 14}
4

["{'dining_room': 0", " 'kitchen': 1", " 'vestiaire1': 13", " 'lounge': 14}"]
["dining_room: 0", " kitchen: 1", " vestiaire1: 13", " lounge: 14"]

dining_room: 0
 kitchen: 1
 vestiaire1: 13
 lounge: 14

["dining_room: 0", " kitchen: 1", " vestiaire1: 13", " lounge: 14"]

2
21
36
55

dining_room: 0,  kitchen: 1,  vestiaire1: 13,  lounge: 14

Je souhaite donc mettre dans la variable « var.deebot_cuisine » uniquement le chiffre 1.
Problème: souvent, l’ordre des pièces change. Il faut donc trouver le chiffre ou nom après le mot « kitchen » et avant la virgule après le mot kitchen.

Quelqu’un peut me dire comment écrire chaque value-template pour chaque variable ?
var.deebot_cuisine
var.deebot_salon
var.deebot_entree
var.deebot_sam

Merci d’avance

Salut,

tu te compliques la vie à parser un table Json à la main, tu n’as pas besoin de le faire.
C’est intégré aux scripts…

{% set my_test_json2 = {'dining_room': 0, 'kitchen': 1, 'vestiaire1': 13, 'lounge': 14}
%}

{{ my_test_json2.dining_room }}
{{ my_test_json2.kitchen }}
{{ my_test_json2.vestiaire1 }}
{{ my_test_json2.lounge }}

resultat

0
1
13
14
2 « J'aime »

Salut !
Merci pour ta réponse. J’avoue ne pas connaitre toutes les possibilités de Home Assistant.

Je me disais bien qu’il devait exister quelque chose de plus simple.

Tu me conseille de le mettre dans une automatisation c’est ça ?
Si oui, comment écrire ça dans une automatisation stp ?

Et ça attribue ca directement dans des variables ou c’est dans autre chose ?

Edit:
J’essaie en écrivant ceci:

{{ states('var.deebot_pieces') }}

{% set deebot_pieces = {'dining_room': 0, 'kitchen': 1, 'vestiaire1': 11, 'study': 2, 'lounge': 12, 'corridor': 6, 'kids_room': 10, 'bathroom': 9, 'laundry': 7, 'gym': 8, 'bedroom': 5} %}
{{ deebot_pieces }}

{{ deebot_pieces.dining_room }}
{{ deebot_pieces.kitchen }}
{{ deebot_pieces.vestiaire1 }}
{{ deebot_pieces.study }}
{{ deebot_pieces.lounge }}
{{ deebot_pieces.corridor }}
{{ deebot_pieces.kids_room }}
{{ deebot_pieces.bathroom }}
{{ deebot_pieces.laundry }}
{{ deebot_pieces.gym }}
{{ deebot_pieces.bedroom }}

{% set deebot_pieces2 = states('var.deebot_pieces') %}
{{ deebot_pieces2 }}

Et j’ai ça en résultat:

{'dining_room': 0, 'kitchen': 1, 'vestiaire1': 11, 'study': 2, 'lounge': 12, 'corridor': 6, 'kids_room': 10, 'bathroom': 9, 'laundry': 7, 'gym': 8, 'bedroom': 5}


{'dining_room': 0, 'kitchen': 1, 'vestiaire1': 11, 'study': 2, 'lounge': 12, 'corridor': 6, 'kids_room': 10, 'bathroom': 9, 'laundry': 7, 'gym': 8, 'bedroom': 5}

0
1
11
2
12
6
10
9
7
8
5


{'dining_room': 0, 'kitchen': 1, 'vestiaire1': 11, 'study': 2, 'lounge': 12, 'corridor': 6, 'kids_room': 10, 'bathroom': 9, 'laundry': 7, 'gym': 8, 'bedroom': 5}

Mais si ensuite je cherche ça:

{{ deebot_pieces2.dining_room }}

j’obtiens ça:

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

Salut,

C’est une histoire de type de données là.
Ton states retourne une chaine de caractères qui n’est pas interprétée.
Du coup il faut une petite conversion, en utilisant « from_json » ça devrait aller mieux:

{% set deebot_pieces2 = (states('var.deebot_pieces')|from_json) %}

C’est touffu, mais y’a beaucoup d’infos là dedans:

1 « J'aime »

J’ai du faire ça :

{% set deebot_pieces2 = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}

Car j’avais ceci si je ne remplaçait pas les ’ par des ":

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

Maintenant, comment utiliser ça pour attribuer chaque résultat dans une variable ?
Je connais les automatisations basiques mais là ca me dépasse un peu.

Une seule automatisation peut le faire?
Voici mes variables à attribuer:

#Deebot X1
deebot_pieces:
  value_template: "{{state_attr('vacuum.pumba_2','rooms')}}"
deebot_entree:
deebot_cuisine:
deebot_sam:
deebot_salon:
deebot_bureau:
deebot_couloir:
deebot_wc:
deebot_sdb:
deebot_parents:
deebot_clara:
deebot_benjamin:

Ou puis-je le faire directement dans value_template dans mon var.yaml ?

Ca va dépendre de tes intentions avec ces variables.
Quel est ton but final, pour le moment tu parles découper le résultat de la liste des pièces de ton robot en variables. Mais tu ne dis pas vraiment l’idée complète.

Si ça se trouve tu n’as même pas besoin de faire tout ça et tu peux directement utiliser une expression template à chaque fois que tu veux trouver une des ces valeurs…

{{ (states('var.deebot_pieces') |replace("'",'"') |from_json).dining_room }}

résultat

0

J’ai mis ça dans mon fichier var.yaml:

#Deebot X1
deebot_pieces:
  value_template: "{{state_attr('vacuum.pumba_2','rooms')}}"
deebot_entree:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.vestiaire1 }}
deebot_cuisine:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.kitchen }}
deebot_sam:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.dining_room }}
deebot_salon:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.lounge }}
deebot_bureau:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.study }}
deebot_couloir:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.corridor }}
deebot_wc:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.laundry }}
deebot_sdb:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.bathroom }}
deebot_parents:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.bedroom }}
deebot_clara:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.gym }}
deebot_benjamin:
  value_template: >-
    {% set deebot_pieces = (states('var.deebot_pieces') |replace("'",'"') |from_json) %}
    {{ deebot_pieces.kids_room }}

C’est ok ? Imaginons le fichier json change et certaines pièces disparraissent. Ca ne v

Ce n’est pas vraiment dynamique c’est sûr, mais ça ne fera qu’une erreur dans le log…
Faudra s’en souvenir quand tu fera une extension de la maison :rofl:

Il faudrait peut être mettre un IF pour savoir s’il y a dans le json tel nom. S’il y est ok s’il n’y est pas on ne l’attribue pas ?

On ne peut pas tester comme ceci l’existence d’un mot dans le json ?

{% if deebot_pieces.kitche in ("undefined", "unavailable", "unknown") %}
{% else %}
{% endif %}

Ca me met ceci:

UndefinedError: 'dict object' has no attribute 'kitche'

J’aimerai juste pouvoir faire une recherche du mot dans le json et si mot trouvé on attribue et si non, on n’attribue pas

j’ai trouvé il faut faire ceci:

{% if ( deebot_pieces | regex_search('kitchen') )  %}
{{ deebot_pieces.kitchen }}
{% endif %}