Afficher sensor nextrain méteo france

Ce que j’ai commencé à faire c’est supprimer les « { » « } » et les " ’ " avec un :

    filters:
      - substitute:
        - "' -> "
        - "{ -> "
        - "} -> "

Après il ne reste plus qu’à utiliser la « , » pour séparer les différentes chaînes et enfin je dirai qu’il suffirait de trouver la première occurrence de « Pluie » dans la chaîne de caractère pour l’afficher.

Sur le papier c’est simple, bon par contre, il faut comprendre comment cela se code en C++ et comment cela s’intègre dans ESPHOME

Je continue mes recherches car cela semble possible. Bon par contre, n’y passe pas tes soirées sauf si tu comptes réutiliser cela pour un autre projet :slight_smile:
Je vais bien finir par comprendre et trouver

j’ai essayé de faire un substitute de :

    filters:
      - substitute:
        - ", -> \\n"

Mais non !

C’était loin d’être con

1 « J'aime »

Je continue de chercher un peu, je suis tomber sur des posts sympas qui parlent de json.
J’aimerai trouver à le faire directement dans ESPHOME car sinon j’aurai le contournement de créer un sensor dans HA pour chaque période 5mn/10mn/15mn etc avec le retour. Ce qui est possible (j’ai galéré mais c’est tout con)

  - platform: template
    sensors:
      next_rain_5:
       value_template: "{{ state_attr('sensor.la_jarrie_next_rain', '1_hour_forecast')['5 min'] }}"
       friendly_name: "5mn"

Donc je pense que l’on peu faire la même chose sous ESPHOME avec le template text sensor mais pour le moment je patine encore.

Bon sinon, il faut que je décode ce post
https://community.home-assistant.io/t/esphome-help-with-nested-attribute-in-homeassistant/341717/8

et surtout https://github.com/niahane/meteo-thermostat/blob/master/termostato-meteo.yaml

Ligne 719 à 767

A priori la solution est dedans

On ne sait jamais cela pourra peut être servir à d’autre.
Ci dessous un code qui fonctionne pour moi :

        lambda: |-
          char *strCopy = strdup( id(Pluie).state.c_str() );
          char delim[] = ",";
          char *prochain;
          prochain = strtok(strCopy, delim);
          int y = 16;
          it.printf(64, 0, id(font4), TextAlign::TOP_CENTER, "Next Rain");
          bool pluieTrouvee = false;
          while ( prochain != NULL ) {
            if (strstr(prochain, "Pluie") != NULL) {
              it.printf( 5, y, id(font1), " %s", prochain );
              y += 14;
              pluieTrouvee = true;
            }
            prochain = strtok(NULL, delim);
          }
          if (!pluieTrouvee) {
            it.printf( 64, 52, id(font6), TextAlign::BASELINE_CENTER, " Pas de pluie" );
          }

Sur la base du Text_Sensor

text_sensor:
  - platform: homeassistant
    name: "NextRain"
    entity_id: sensor.la_jarrie_next_rain
    id: Pluie
    attribute: 1_hour_forecast
    filters:
      - substitute:
        - "' -> "
        - "{ -> "
        - "} -> "

Il y a certainement moyen de faire plus propre ou autrement mais je n’ai pas trouvé

Bonne soirée

EDIT : modification du code. toujours la même base mais je saturai la mémoire et l’ESP se déconnectait

        lambda: |-
          std::string strCopy = id(Pluie).state;
          std::string delim = ",";
          size_t pos = 0;
          int y = 16;
          int i = 0;
          it.printf(64, 0, id(font4), TextAlign::TOP_CENTER, "Next Rain");
          bool pluieTrouvee = false;
          while ((pos = strCopy.find(delim)) != std::string::npos && i < 20) {
              std::string prochain = strCopy.substr(0, pos);
              if (prochain.find("Pluie") != std::string::npos) {
                i++;
                it.printf( 2, y, id(font1), " %s", prochain.c_str() );
                y += 16;
                pluieTrouvee = true;
                delay(100);
              }
              strCopy.erase(0, pos + delim.length());
              delay(100);
          }
          if (!pluieTrouvee) {
              it.printf( 64, 52, id(font6), TextAlign::BASELINE_CENTER, " Pas de pluie" );
          }