Heure d'ouverture boite aux lettres

Bonjour,

J’utilise un capteur de vibration Xiaomi dans ma boite aux lettres.
Pour être prévenu, j’utilise une notification sur mon smartphone qui me signale qu’un courrier ou un colis est dans la boite. Ça fonctionne très bien sous cette manière.
Cependant j’aimerai trouver une solution pour avoir l’heure de la dernière détection sur une carte lovelace par exemple.
J’ai trouvé cette solution qui fonctionne « partiellement » :

- platform: template
    sensors:
        boite_aux_lettres:
        value_template: "{{ states.binary_sensor.lumi_lumi_vibration_aq1_ias_zone.last_updated }}"
        device_class: timestamp

« Ça fonctionne », mais l’heure d’ouverture est en UTC (donc -2h). J’ai essayé de convertir cette heure… sans succès.

Le but est qu’en ce moment, je m’occupe avec un ESP8266 + un écran 4.2" ePaper.
J’aimerai afficher dessus l’heure d’ouverture de ma boite aux lettres.

Avez-vous une idée, une meilleure solution ?

Merci.

1 « J'aime »

Salut,
Je vais me servir de ton idée et du coup, j’ai trouvé ça qui à l’air de fonctionner.
2021-04-07 10:34:29.102614+02:00
Mais j’aimerai n’avoir que: 2021-04-07 10:34:29 et là j’ai pas encore trouver comment faire.

- platform: template
    sensors:
        boite_aux_lettres:
        value_template: "{{ as_local(states.binary_sensor.lumi_lumi_vibration_aq1_ias_zone.last_updated) }}"
        device_class: timestamp

Bonjour,

Interréssé aussi par la question, j’ai testé plusieurs exemples et j’ai trouvé cette syntaxe:

{{ as_local(states.sun.sun.last_updated).strftime('%d/%m/%Y %H:%M') }} => 07/04/2021 11:51

Super, ça marche nickel, j’avais bien essayé cette fonction strftime() mais je n’avais pas mis '%d/%m/%Y %H:%M' alors forcement…Quel boulet je fais.

@Nicolas_jouffroy,

Je serais très intérréssé par ton affichage sur un ecran e-paper.
Tu pourrais partager ton code de l’esp ?

J’ai un e-paper Wareshare 2.9" qui m’attends, je réfléchis à quelque chose de similaire mais alimenté par pile.

Merci :slight_smile:

Ta solution m’a beaucoup aidée. J’ai modifié comme ceci.

- platform: template
    sensors:      
      boite_aux_lettres:
        value_template: "{{ as_local(states.binary_sensor.lumi_lumi_vibration_aq1_ias_zone.last_updated).timestamp() | timestamp_custom('%d/%m/%Y %H:%M') }}"
        icon_template: mdi:calendar-clock

Voici le résultat : 07/04/2021 12:12

Merci beaucoup. Je vais tenter maintenant d’ajouter tout ceci dans mon écran epaper.

Merci également.

Nous avons donc plusieurs solutions.

Aucun souci pour le code pour l’écran epaper.
Je te le partage tout à l’heure (après le repas).

Juste pour dire que la documentation est bien fournie :

Et si ça ne suffit pas, regardez par ici : The EPIC Time Conversion and Manipulation Thread! - Configuration - Home Assistant Community

1 « J'aime »

Voici le code de l’esp (epaper-display.yaml).
Je l’ai eu récemment, c’est donc encore en « construction ». Certainement du nettoyage à faire…
Surtout que j’ai peu connaissance en code :hot_face:

esphome:
  name: epaper-display
  platform: ESP8266
  board: esp01_1m
  on_boot:
    priority: -10
    then:
      - delay: 10s
      - component.update: epaperdisplay

wifi:
  ssid: xx
  password: xxx

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Epaper-Display Fallback Hotspot"
    password: xx

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api: 

ota:
  password: "xx"


font:

  - file: 'fonts/materialdesignicons-webfont.ttf'
    id: icon_font_30
    size: 30
    glyphs:
      - "\U000F050F" # Temp
      - "\U000F029A" # Pressure
      - "\U000F15FA" # Wind
      - "\U000F058C" # Rain
      - "\U000F0597" # Chance pluie 0F0597
      - "\U000F04B9" # Dedans canapé
      - "\U000F09F1" # Dehors tulipe 0F09F1
      - "\U000F0F2F" # Alerte meteo

  - file: 'fonts/Roboto-Medium.ttf'
    id: roboto_med_30
    size: 30
  - file: 'fonts/Roboto-Regular.ttf'
    id: footer_font
    size: 15
    glyphs:
      ['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
       '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
       'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
       'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
       'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
       'u', 'v', 'w', 'x', 'y', 'z','å', 'ä', 'ö', '/','º','µ','³']

  - file: 'fonts/Roboto-Regular.ttf'
    id: main_sensor_unit
    size: 20
    glyphs:
      ['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
       '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
       'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
       'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
       'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
       'u', 'v', 'w', 'x', 'y', 'z','å', 'ä', 'ö', '/','º','µ','³']
       
  - file: 'fonts/Roboto-Medium.ttf'
    id: sub_sensor_font
    size: 25
    glyphs:
      ['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
       '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
       'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
       'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
       'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
       'u', 'v', 'w', 'x', 'y', 'z','å', 'ä', 'ö', '/','º','µ','³']
  
  - file: 'fonts/Roboto-Bold.ttf'
    id: main_sensor_font
    size: 70
  
  - file: 'fonts/materialdesignicons-webfont.ttf'
    id:  mdi_small
    size: 31
    glyphs: [
       # Wifi
      '󰤫', # mdi-wifi-strength-alert-outline
      '󰤟', # mdi-wifi-strength-1
      '󰤢', # mdi-wifi-strength-2
      '󰤥', # mdi-wifi-strength-3
      '󰤨', # mdi-wifi-strength-4
      '󰖎', # mdi-water-percent
      '󰔏'  # mdi-weather-windy          
      ]

  - file: 'fonts/materialdesignicons-webfont.ttf'
    id:  mdi_wifi
    size: 20
    glyphs: [
      # Wifi
      '󰤫', # mdi-wifi-strength-alert-outline
      '󰤟', # mdi-wifi-strength-1
      '󰤢', # mdi-wifi-strength-2
      '󰤥', # mdi-wifi-strength-3
      '󰤨', # mdi-wifi-strength-4
      '󰔏'  # mdi-weather-windy 

      ]

  - file: 'fonts/materialdesignicons-webfont.ttf'
    id:  mdi_med
    size: 33
    glyphs: [
      # Wifi
      '󰤫', # mdi-wifi-strength-alert-outline
      '󰤟', # mdi-wifi-strength-1
      '󰤢', # mdi-wifi-strength-2
      '󰤥', # mdi-wifi-strength-3
      '󰤨', # mdi-wifi-strength-4
      '󰀦', # mdi-alert
      '󰔏'  # mdi-weather-windy 
      ]

time:
  - platform: homeassistant
    id: homeassistant_time

#Please edit your homeassistant sensors enitity id to match yours
sensor:
  - platform: homeassistant
    entity_id: sensor.tz2000_a476raq2_ts0201_temperature
    id: temp_interieur
    internal: true
  
  - platform: homeassistant
    entity_id: sensor.tz2000_a476raq2_ts0201_humidity
    id: humid_indoor

  - platform: homeassistant
    entity_id: sensor.chalon_sur_saone_rain_chance
    id: chance_rain
    icon: "mdi:weather-rainy"

  - platform: homeassistant
    entity_id: sensor.lumi_lumi_weather_temperature
    id: temp_exterieur
    internal: true

  - platform: homeassistant
    entity_id: sensor.lumi_lumi_weather_humidity
    id: humid_outdoor

  - platform: homeassistant
    entity_id: sensor.chalon_sur_saone_wind_speed
    id: wind_outdoor
    icon: "mdi:weather-windy"
    

  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    id: wifisignal
    update_interval: 60s

  - platform: homeassistant
    entity_id: sensor.ext_temp_max
    id: temp_exterieur_max
    internal: true

  - platform: homeassistant
    entity_id: sensor.ext_temp_min
    id: temp_exterieur_min
    internal: true

text_sensor:

  - platform: homeassistant
    name: "weather_alert"
    entity_id: sensor.71_weather_alert
    id: weather_alert

spi:
  clk_pin: 14
  mosi_pin: 13  #DIN
  
display:
  - platform: waveshare_epaper
    id: epaperdisplay
    cs_pin: 15
    dc_pin: 12
    update_interval: 60s
    busy_pin: 16
    reset_pin: 4
    model: 4.20in
    lambda: |-    
      
      int indoor_humid = int(id(humid_indoor).state);
      float indoor_temp = int(id(temp_interieur).state);
      int outdoor_humid = int(id(humid_outdoor).state);
      float outdoor_temp = int(id(temp_exterieur).state);
      int dehors_vent = int(id(wind_outdoor).state);
      int chance_pluie = int(id(chance_rain).state);

      float temp_min = int(id(temp_exterieur_min).state); /* température min */
      float temp_max = int(id(temp_exterieur_max).state); /* température maxi */

      std::string val = to_string(id(weather_alert).state); /* affichage sensor de type texte */

      
      

      /* DEHORS */
      
      
      it.print(5, 5, id(icon_font_30), "\U000F09F1"); /* icone dehors */
      it.filled_rectangle(47, 21, 375, 3);      
      it.print(375, 100, id(mdi_small), TextAlign::BASELINE_CENTER, "󰖎"); //water-percent
      /* it.print(0, 114,  id(mdi_small), TextAlign::BASELINE_LEFT, "󰔏"); //thermoter */
      it.print(365, 25, id(icon_font_30), "\U000F15FA"); /* icone vent */
      it.printf(357, 50, id(main_sensor_unit), TextAlign::BASELINE_RIGHT , "%3dkm/h", dehors_vent);
      it.printf(225, 114, id(main_sensor_font), TextAlign::BASELINE_RIGHT , "%.1f°", id(temp_exterieur).state); 
      it.printf(357, 145, id(main_sensor_unit), TextAlign::BASELINE_RIGHT , "%3d%%", chance_pluie);
      it.print(360, 125, id(icon_font_30), "\U000F0597"); /* icone chance pluie */

      it.print(47,30, id(main_sensor_unit), "min:");
      it.printf(87, 30, id(main_sensor_unit), "%.1f°", id(temp_exterieur_min).state);

      it.print(147,30, id(main_sensor_unit), "max:");
      it.printf(190, 30, id(main_sensor_unit), "%.1f°", id(temp_exterieur_max).state);

      it.printf(125,125, id(main_sensor_unit), "%s",id(weather_alert).state.c_str()); /* affichage alerte meteo texte verte jaune rouge */
      it.print(85, 122, id(icon_font_30), "\U000F0F2F"); /* icone alerte meteo */


      if(indoor_humid >=0 && indoor_humid <= 100){
        it.printf(357, 95, id(main_sensor_unit), TextAlign::BASELINE_RIGHT , "%3d%%", outdoor_humid);
      }else{
        it.print(357, 95, id(main_sensor_unit), TextAlign::BASELINE_RIGHT , " -  %");
      }
      
      


      /* DEDANS */

      
      int offsetY = 137;
      
      it.print(5, 5 + offsetY, id(icon_font_30), "\U000F04B9"); /* icone dedans */

      it.filled_rectangle(47, 21 + offsetY, 375, 3);
      it.print(375, 75 + offsetY,  id(mdi_small), TextAlign::BASELINE_CENTER, "󰔏"); //thermometer
      /* it.print(0, 114 + offsetY,  id(mdi_small), TextAlign::BASELINE_LEFT, "󰔏"); //thermoter */

      it.print(375, 115 + offsetY, id(mdi_small), TextAlign::BASELINE_CENTER, "󰖎"); //water-percent
      it.printf(225, 114 +offsetY, id(main_sensor_font), TextAlign::BASELINE_RIGHT , "%.1f°", id(temp_interieur).state);

      if(indoor_temp > -100 && indoor_temp < 100){
        it.printf(357, 75 + offsetY, id(sub_sensor_font), TextAlign::BASELINE_RIGHT , "%.1fº", id(temp_interieur).state);
      }else{
        it.print(357, 75 + offsetY, id(sub_sensor_font), TextAlign::BASELINE_RIGHT , " - º");
      }

      if(indoor_humid >=0 && indoor_humid <= 100){
        it.printf(357, 115 + offsetY, id(sub_sensor_font), TextAlign::BASELINE_RIGHT , "%3d%%", indoor_humid);
      }else{
        it.print(357, 115 + offsetY, id(sub_sensor_font), TextAlign::BASELINE_RIGHT , " -  %");
      }
      
      
      
      
      /* PIED DE PAGE */
      it.strftime(355, 295 , id(footer_font), TextAlign::BASELINE_RIGHT , "Mise a jour %H:%M", id(homeassistant_time).now());
      
      /* WiFi Signal Strenght */
      if(id(wifisignal).has_state()) {
        int x = 375;
        int y = 295;
        if (id(wifisignal).state >= -50) {
            //Excellent
            it.print(x, y, id(mdi_wifi), TextAlign::BASELINE_CENTER, "󰤨");
            ESP_LOGI("WiFi", "Exellent");
        } else if (id(wifisignal).state  >= -60) {
            //Good
            it.print(x, y, id(mdi_wifi), TextAlign::BASELINE_CENTER, "󰤥");
            ESP_LOGI("WiFi", "Good");
        } else if (id(wifisignal).state  >= -75) {
            //Fair
            it.print(x, y, id(mdi_wifi), TextAlign::BASELINE_CENTER, "󰤢");
            ESP_LOGI("WiFi", "Fair");
        } else if (id(wifisignal).state  >= -100) {
            //Weak
            it.print(x, y, id(mdi_wifi), TextAlign::BASELINE_CENTER, "󰤟");
            ESP_LOGI("WiFi", "Weak");
        } else {
            //Unlikely working signal
            it.print(x, y, id(mdi_wifi), TextAlign::BASELINE_CENTER, "󰤫");
            ESP_LOGI("WiFi", "Unlikely");
        }
      }
2 « J'aime »

Pour donner suite.
Ça fonctionne très bien.(en bas à gauche de l’écran epaper.)
Merci encore.

1 « J'aime »

moi itou, je l’ai intégré dans mon dashboard.
Screenshot_2021-04-07 Aperçu - Home Assistant

2 « J'aime »

Super intéressant ton projet, merci du partage ! :+1:

Merci pour le partage.
Cela rend vraiment bien visuellement ces e-paper

Whaouu merci pour ce partage. Je ne connaissais pas ces e-paper mais je trouve ça vraiment très intéressant pour nos installations domotique !

J’ai vu dans ton code que le rafraichissement se faisait toutes les 60s mais est-ce qu’il serait envisageable avec ce type de matériel de faire défiler 2 ou 3 écrans différents par exemple ? Genre toutes les 20s on aurait une page différente qui s’affiche et cela bouclerait ainsi.

Ici https://connected-environments.org/making/the/
la personne arrive à faire défiler plusieurs pages (voir la vidéo). Mais c’est avec un Raspberry Pi.
Avec l’ESP, on peut aller plus loin aussi comme afficher des icônes selon l’état (pluie soleil neige par ex.).
Pour moi, ça sera la seconde étape.

Le rafraîchissement de 60 s je l’ai passé à 10 min, largement suffisant pour mon utilisation.
Le « défaut » de ce type d’écran est le rafraîchissement. Lors du rafraîchissement une inversion complète blanc et noir se fait pour revenir dans son état précédent. Cette bascule est très visible car elle dur 1 seconde environ.
Je pense que ce rafraîchissement est obligatoire, car une fois l’écran marqué, l’affichage reste visible même hors tension… (je n’ai pas testé sur plusieurs heures).

Au passage si quelqu’un ici sait comment inverser le noir et le blanc de façon permanente… parce que c’est très beau aussi dans ce sens (fond noir et police blanche). Je pense que c’est possible, mais seulement vu sur photos…

Merci d’ouvrir un post dédié :+1:

Un message a été scindé en un nouveau sujet : Changer le pied de page (footer) suivant l’état d’une entité

Salut Nicolas,

J’ai aussi un capteur vibration aqara de chez Xiaomi, pour le moment j’ai juste créer une notification qui m’indique s’il y a du courrier. J’ai collé le capteur sur la plaque de la fente.
Mais j’ai utilisé l’entitée « vibrationstrength » dans mon automatisation, du coup je ne sais pas si j’ai un courrier ou un colis. J’aimerai avoir 2 automatisations differentes. Comment l’a tu intégrer dans tes automations ? A quoi ressemble t’elle ?
Pour info je passe par deconz :wink:

'on': true
temperature: 18
orientation:
  - -83
  - -3
  - 6
tiltangle: 136
vibrationstrength: 41
friendly_name: vibration bal
device_class: vibration

Salut,

C’est vrai que ma phrase porte à confusion…

Pour différencier l’ouverture de la trappe et de l’ouverture de la porte, pour moi il faut 2 capteurs.
Je l’avais fait à une époque avec 2 capteurs d’ouvertures de porte/fenêtres Xiaomi. On peut différencier les 2 très facilement avec fiabilité.
Seulement l’installation est plus « délicate ». Souvent j’avais un aimant de porte ou de trappe qui se décollait. Parfois les colis sont gros et ils frottent partout, sinon un livreur un peu brusque décollait les capteurs.
Pour cette raison, j’ai voulu faire ultra simple. Si j’ai une vibration, c’est que quelque chose est dans la boite, courrier pub ou colis.
Donc non, mon capteur de vibration ne différencie pas une enveloppe et un colis.

ah voila :sweat_smile:
je vais essayer de trouver une solution pour différencier les deux :slight_smile: s’il y a du monde de partant pour m’aider :grin:
J’ai mi en place mon capteur sur la petite trappe.
Maintenant il faut que determine les valeurs de quand la petite trappe est ouverte (lettres) ou bien quand la grande porte est ouverte (colis)