Problème d'état switch RESTful

Bonjour a Tous j’essai de créer un switch pour changer l’état de l’« auxiliaire » de ma filtration de piscine grâce
a l’API de cette dernière (API - Aide & Support Oklyn)
j’arrive a changer l’état, mais pas a récupérer l’état… mon switch revient systématiquement en « inactif »
j’ai créer parallèlement un Sensor qui remonte sans problème l’état de mon "auxiliaire " mais cela ne résout pas le problème de mon switch
voici ma dernière version

- platform: rest
  method: put
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "electrolyse piscine"
  body_on: '{ "aux": "on"}'
  body_off: '{ "aux": "off"}'
  is_on_template: '{{ value_json == body_on }}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:xxx

pour info voici la réponse a la requête PUT obtenue avec POSTMAN

{
    "aux": "on",
    "status": "on",
    "changed_at": "2022-01-18T16:50:42+00:00"
}

merci d’avance

Ma configuration


[ Santé du système

Version core-2021.12.10
Type d’installation Home Assistant OS
Développement false
Supervisor true
Docker true
Utilisateur root
Environnement virtuel false
Version de Python 3.9.7
Famille du système d’exploitation Linux
Version du système d’exploitation 5.10.63-v8
Architecture du processeur aarch64
Fuseau horaire Europe/Paris

Dans la doc, on voit:

is_on_template string (optional)
A template that determines the state of the switch from the value returned by the GET request on the resource URL. This template should compute to a boolean (True or False). If the value is valid JSON, it will be available in the template as the variable value_json. Default is equivalent to ‹ {{ value_json == body_on }} ›. This means that by default, the state of the switch is on if and only if the response to the GET request matches.

le is_on_template semble être forcément le résultat d’un GET qui peut d’ailleurs être différent de l’URL resource.
Mais, en tout cas, ce que tu as n’est pas conforme à la doc (si ton switch de la piscine ne répond pas comme il faut au GET) et donc c’est « normal » que ça coince.

Il faut éventuellement passer par un state_resource .

Salut @golfvert merci de ta reponse
Le resource et le state-resource sont identiques c’est pour ça que je n’ai rien mis (même si j’ai bien tenté de le mettre dans une de mes versions)
La notion de template pour le « is-on-template » m’échappe notamment au niveau de la présentation!
Voici la présentation de mon Sensor ou l’ont peut voir que la resource est la même

- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "statut aux"
  scan_interval: 600
  value_template: '{{value_json["aux"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN: xxxx

En supposant (ce que la doc ne dit pas…) que le switch rest puisse aussi récupérer son état via la command PUT, je mettrais

is_on_template:: '{{ value_json.status }}'

La syntaxe bizarre dit à HA de regarder dans le json qui a pour nom value_json, la valeur de la clé ‹ status ›

Le switch récupère son état via la commande GET et change l’état via une commande PUT, POST ou PATCH c’est l’introduction de la page RESTful switch, je suppose qu’il y a donc 2 commandes à la suite, après une demande de changement d’état.
j’ai testé ta ligne @golfvert , malheureusement pas de changement!

- platform: rest
  method: put
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "electrolyse piscine"
  body_on: '{ "aux": "on"}'
  body_off: '{ "aux": "off"}'
  is_on_template: '{{ value_json.status }}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:xxx

Est ce que je ne doit pas indiquer via un « template » que « aux: on »=True
La doc dit: This template should compute to a boolean (True or False)??

Tu as raison. Il va falloir trifouiller dans le jinja2… Il faut aller dans les outils de développement pour trouver la syntaxe exacte.
Si tu fais GET de

Tu récupères quoi exactement?
A moins que la doc ne soit pas exacte (ça m’étonnerait) c’est bien un GET qui doit permettre de récupérer l’état.

faire un GET revient au Sensor que j’ai créer

- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "statut aux"
  scan_interval: 600
  value_template: '{{value_json["aux"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN: xxxx

sous POSTMAN j’obtiens la même réponse que avec le PUT, a savoir:

{
    "aux": "on",
    "status": "on",
    "changed_at": "2022-01-18T16:50:42+00:00"
}

a savoir que le « statut » met en général 2/3 sec a changer après une commande PUT
de ce fait le reponse obtenue sur Postman après un PUT ressemble a ça:

{
    "aux": "on",
    "status": "off",
    "changed_at": "2022-01-19T14:48:56+00:00"
}

A partir de outils de développement et template, tu peux tester le jinja2.
Ca doit faire un truc comme ça:

value_template: >-
  {% if value_json.status == "on" %} True
  {% else %} False
  {% endif %}

Bon, après jinja2 et moi, on n’est pas trop pote… L’idée générale est là, je pense.

Merci @golfvert je vais tester ça et essayer de travailler a partir de la si jamais ça ne marche pas tel quel, mais avant tout une petite question … ou est ce que je colle ce bout de code ?

Comme ça:

- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "statut aux"
  scan_interval: 600
  value_template: >-
    {% if value_json.status == "on" %} True
    {% else %} False
    {% endif %}
  headers:
    content-type: "application/json"
    X-API-TOKEN: xxxx

merci je travail là dessus !
bonne fin de soirée

C’est parfait merci @golfvert ça fonctionne!!
voici la version finale:

- platform: rest
  method: put
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "electrolyse piscine"
  body_on: '{ "aux": "on"}'
  body_off: '{ "aux": "off"}'
  scan_interval: 600
  is_on_template: >-
    {% if value_json.aux == "on" %} True
    {% else %} False
    {% endif %}
  headers:
    content-type: "application/json"
    X-API-TOKEN:xxxx

J’ai mis la variable ‹ is_on_template › car la ‹ value_template › n’est pas valide pour un switch,
Je me suis appuyé sur la valeur de « aux » sinon le décalage de la mise a jour du statut laissait le temps au switch de rebasculer en « inactif »
et j’ai ajouter un Scan si jamais je change le statut a sans passer par home assistant

Bonne nuit et encore merci

Bonjour,

En copiant ta solution ma partie « aux » ne fonctionne pas.
As tu effectué des changement depuis ?

SAlut @Zigfou
Dis m’en un peu plus sur ton problème!
je n’ai pas retouché au code depuis 2ans et tout fonctionne très bien.
on est d’accord qu’il faut changer le X-API-TOKEN par ton token perso !
As tu réussi a configurer le reste de l’api Oklyn ?(filtration, PH, temp air/eau)

Oui bien sur, les sensor sont OK mais la partie auxiliaire ne fonctionne pas.

# Mesure Ph Piscine
  - platform: rest
    resource: https://api.oklyn.fr/public/v1/device/1xx/data/ph
    method: GET
    name: "Ph Piscine"
    unique_id: binary_sensor.ph piscine
    scan_interval: 60
    value_template: '{{ value_json.value }}'
    headers:
      X-API-TOKEN: Xxx
    
# Mesure air Piscine
  - platform: rest
    resource: https://api.oklyn.fr/public/v1/device/1xx/data/air
    method: GET
    name: "Air Piscine"
    unique_id: binary_sensor.air piscine
    scan_interval: 60
    value_template: '{{ value_json.value }}'
    headers:
      X-API-TOKEN: Xxx
    
# Mesure Eau Piscine
  - platform: rest
    resource: https://api.oklyn.fr/public/v1/device/1xx/data/water
    method: GET
    name: "Eau Piscine"
    unique_id: binary_sensor.eau piscine
    scan_interval: 60
    value_template: '{{ value_json.value }}'
    headers:
      X-API-TOKEN: Xxx

# Mesure redox
  - platform: rest
    resource: https://api.oklyn.fr/public/v1/device/1xx/data/orp
    method: GET
    name: "redox Piscine"
    unique_id: binary_sensor.redox piscine
    scan_interval: 60
    value_template: '{{ value_json.value }}'
    headers:
      X-API-TOKEN: Xxx
      

N’étant pas programmeur, j’utlise les infos et les recherches des autres et pour le coup, je suis aussi preneur pour la partie pompe.

@Zigfou

pour l’aux il s’agit de créer un switch, est ce que tu a mis ton code au bon endroit?

pour la pompe voici mon morceau de code qui me permet de changer le mode:

rest_command:
  pompe_on:
    url: "https://api.oklyn.fr/public/v1/device/my/pump"
    method: put
    payload: '{ "pump": "on"}'
    headers:
      content-type: "application/json"
      X-API-TOKEN:  XXX
  pompe_off:
    url: "https://api.oklyn.fr/public/v1/device/my/pump"
    method: put
    payload: '{ "pump": "off"}'
    headers:
      content-type: "application/json"
      X-API-TOKEN:  XXX
  pompe_auto:
    url: "https://api.oklyn.fr/public/v1/device/my/pump"
    method: put
    payload: '{ "pump": "auto"}'
    headers:
      content-type: "application/json"
      X-API-TOKEN:  XXX

j’en profite pour te mette tout les sensors que j’ai crées

- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/data/ph
  name: "PH Piscine"
  scan_interval: 600
  value_template: '{{value_json["value_raw"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/data/orp
  name: "RedOx Piscine"
  scan_interval: 600
  value_template: '{{value_json["value_raw"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/data/water
  name: "Temp Piscine"
  device_class: temperature
  scan_interval: 600
  value_template: '{{value_json["value_raw"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/pump
  name: "mode pompe piscine "
  scan_interval: 600
  value_template: '{{value_json["pump"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/data/ph
  name: "statut PH Piscine"
  scan_interval: 600
  value_template: '{{value_json["status"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/data/orp
  name: "statut Red Ox Piscine"
  scan_interval: 600
  value_template: '{{value_json["status"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/pump
  name: "statut pompe piscine"
  scan_interval: 600
  value_template: '{{value_json["status"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX
- platform: rest
  resource: https://api.oklyn.fr/public/v1/device/my/aux
  name: "statut aux"
  scan_interval: 600
  value_template: '{{value_json["aux"]}}'
  headers:
    content-type: "application/json"
    X-API-TOKEN:  XXX

en esperant que ça t’aide

1 « J'aime »

Un GRAND merci pour ton aide, et également pour tes sensors.J’ai rajouter des id uniques et tout est nickel.
Pour la pompe, j’arrive à créer mes bouton on, off et auto.Mais visiblement je ne sais pas ou placer la commande pour l’auxiliaire.J’ai toujours ce problème de configuration yaml qui ne fonctionne pas.
J’ai essayé dans, le fichier conf yaml et dans celui que j’ai crée command_line_yaml

Voilà la commande qui fonctionne chez moi pour allumer la prise auxiliaire, qui chez moi est l’éclairage de la piscine.

switch:
  - platform: rest
    method: put
    resource: https://api.oklyn.fr/public/v1/device/my/aux
    name: "Lumiere piscine"
    unique_id: binary_sensor.Lumiere piscine
    body_on: '{"aux": "on"}'
    body_off: '{"aux": "off"}'
    is_on_template: "{{ value_json.is_active }}"
    headers:
      Content-Type: application/json
      X-API-TOKEN:  
      X-Custom-Header: '{{ states("input_text.the_custom_header") }}'
    verify_ssl: true
1 « J'aime »

Top donc c’est bon tout fonctionne!?