[Article] Multi-capteurs DYI : radar de présence, température, lumière et bien plus

Je viens de publier un nouvel article sur notre portail. :fire:

Venez le découvrir dès maintenant !

Merci pour vos commentaires et retours. :blush:

Bonne lecture !

11 « J'aime »

Salut

Excellent article et très bien documenté :+1:

Vincèn

1 « J'aime »

Super taf @freetronic et @Gael
sorry j’ai pas eu le temps de lire avant la publication :frowning:
Mais c’est toujours un super travail donc j’avais pas trop de soucis sur la version final

1 « J'aime »

la c’est pas moi, juste @freetronic

1 « J'aime »

J’ai juste survolé l’article rapidement et, franchement, il me tarde de me poser pour le lire.
Merci d’avance pour cette lecture qui, en ce moment, occupe une partie de mon temps libre.

1 « J'aime »

Bonjour,
tu ne parles pas du mode engineering et du capteur de lumière sur le LD2410. A moins que j’ai mal lu.
Je le trouve pratique quand on n’a pas de capteur de luminosité, pour faire des scenarios.

esphome:
  name: ${name}
  name_add_mac_suffix: false
  friendly_name: ${friendly_name}
  on_boot: 
    then:      
      - switch.turn_on: engineering_mode_on

sensor:
  - platform: ld2410
    light: #intensité lumineuse
      name: light
      id: lightintensite

switch:
  - platform: ld2410
    engineering_mode:
      name: engineering mode
      id: engineering_mode_on
      entity_category: "diagnostic"
  - platform: ld2410
    has_target: #Présence
      name: Presence
      on_press:
        - if:
            condition:
              lambda: return id(lightintensite).state < 95;
            then:
              - homeassistant.action:
                  action: light.turn_on
                  data:
                    entity_id: light.0x00158d000501ccd9
      on_release:
        - if:
            condition:
              text_sensor.state:
                id: hotteaspirante
                state: 'off'
            then:
              - homeassistant.action:
                  action: light.turn_off
                  data:
                    entity_id: light.0x00158d000501ccd9

2 « J'aime »

Hello,

J’en parle très succinctement, merci du complément :wink:

Le ld2410 a un capteur de luminosité intégré, mais, il ne fonctionne qu’en mode engineering

cdt

1 « J'aime »

Re,

Bon maintenant que c’est la fin du week, et que vous aurez moins de temps, vous êtes parés pour la suite qui arrive? on a posé les bases avec les détections de présence, et on va se servir de cette détection… on va gentiment monter dans les tours d’ici quelques temps avec cette suite dont je tairai la fonction… (il faut garder un peu de suspens :slight_smile: )

Alors il est pas beau mon teasing? :grin:
A vos ESP, prêts, partez!!!

cdt

4 « J'aime »

non, pas ça, y a trop de suspens maintenant, a quoi pourrait bien servir la présence ??? :thinking:

A détecter la fin du cycle de la machine à laver ? :innocent:

2 « J'aime »

Hello,

Beeep !! non, merci d’avoir jouer avec nous :wink:

cdt

1 « J'aime »

Re,

Et voilà maintenant vous connaissez la suite [Article] Notifications dynamiques en fonction de la pièce occupée

bonne lecture :wink:

cdt

Re,

**Attention je viens de me rendre compte que le schéma de câblage du 1750 sur le gif est faux, il faut bien prendre le schéma en image en dessous ( le même que dans l’article ) **

gif corrigé

1

cdt

Refais le gif et change-le :wink:

Re,

Oui c’est dans la todo, mais j’ai mis une rustine en attendant :wink:

1 « J'aime »

Re,

Voilà c’est corrigé dans l’article :wink: et j’ai complété le message au dessus avec le bon gif

cdt

2 « J'aime »

Re,

Si ça intéresse du monde je me suis penché sur une custom:button-card, avec les infos cliquable pour les esp

Je ne sais pas si j’ai le meilleur code du monde mais c’est fonctionnel

1

wifi 3 couleurs fixes vert orange rouge, suivant la valeur
température mesurée via capteur, 5 couleurs suivant la valeur
uptime tjs en blanc
température interne esp 3 couleurs vert fixe orange fixe rouge cligotant, suivant la valeur
lux mesurée via capteur 3 couleurs fixes noir jaune blanc de plus sombre au plus lumineux
detection radar via 2010 vert fixe rouge clignotant avec changement d’icone status vert si connecté, orange clignotant si unavailable rouge clignotant si off 3 icones
memoire dispo sur l’esp vert, orange rouge clignotant suivant la valeur

Le code est un peu copieux par contre, et je n’ai pas la version finale sur ma page surveillance matérielle

Code de la carte
type: custom:button-card
name: Entree1
show_name: false
styles:
  card:
    - background: rgba(var(--rgb-secondary-text-color), 0.2) !important
    - padding: 0px
    - border-radius: 15px !important
    - box-shadow: none
  grid:
    - grid-template-areas: |
        "name wifi temp uptime intern_temp"
        "name lux radar status mem"
    - grid-template-columns: 80px 0.54fr 0.43fr 1.0fr 0.43fr
    - grid-template-rows: auto auto
custom_fields:
  name: |
    [[[
      return `<div style="text-align:left; font-size:12px; font-weight:bold; padding:2px 8px; display:flex; align-items:center; white-space:nowrap;">Entree1</div>`;
    ]]]
  wifi:
    card:
      type: custom:button-card
      entity: sensor.esp1_entree_wifi_signal_strength
      icon: mdi:wifi
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      color: |
        [[[
          const s = states['sensor.esp1_entree_wifi_signal_strength'];
          if (!s || s.state === 'unavailable') return "grey";
          const value = parseInt(s.state);
          return value <= -70 ? "red" : value <= -55 ? "orange" : "green";
        ]]]
      state_display: |
        [[[
          const s = states['sensor.esp1_entree_wifi_signal_strength'];
          if (!s || s.state === 'unavailable') return "N/A";
          return Math.round(parseFloat(s.state)) + "dB";
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: rgba(0,0,0,0.5)
          - border-radius: 10px
          - padding: 0px 2px
          - cursor: pointer
          - height: 20px
          - min-height: 22px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
        state:
          - font-size: 12px
          - font-weight: bold
          - white-space: nowrap
  temp:
    card:
      type: custom:button-card
      entity: sensor.esp1_entree_temperature1
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: |
        [[[
          return "mdi:thermometer";
        ]]]
      color: |
        [[[
          const s = states['sensor.esp1_entree_temperature1'];
          if (!s || s.state === 'unavailable') return "grey";
          const value = parseFloat(s.state);

          if (value <= 15) return "skyblue";
          else if (value <= 20) return "green";
          else if (value <= 25) return "orange";
          else if (value <= 29) return "red";
          else return "brown";
        ]]]
      state_display: |
        [[[
          const s = states['sensor.esp1_entree_temperature1'];
          if (!s || s.state === 'unavailable') return "N/A";
          return parseFloat(s.state).toFixed(1) + "°";
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 4px
          - padding: 1px 2px
          - cursor: pointer
          - height: 24px
          - min-height: 24px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
          - animation: |
              [[[
                const s = states['sensor.esp1_entree_temperature1'];
                if (!s || s.state === 'unavailable') return "none";
                const value = parseFloat(s.state);
                return value >= 65 ? "blink 1s infinite" : "none";
              ]]]
        state:
          - font-size: 12px
          - font-weight: bold
  uptime:
    card:
      type: custom:button-card
      entity: sensor.esp1_entree_uptime_jours_heures_et_minutes
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: mdi:timer-outline
      color: white
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 6px
          - padding: 2px
          - cursor: pointer
          - height: 28px
          - min-height: 28px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 4px
        state:
          - font-size: 12px
          - font-weight: bold
  intern_temp:
    card:
      type: custom:button-card
      entity: sensor.esp1_entree_intern_temp
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: |
        [[[
          return "mdi:thermometer";
        ]]]
      color: |
        [[[
          const s = states['sensor.esp1_entree_intern_temp'];
          if (!s || s.state === 'unavailable') return "grey";
          const value = parseFloat(s.state);
          return value >= 65 ? "red" : value >= 50 ? "orange" : "green";
        ]]]
      state_display: |
        [[[
          const s = states['sensor.esp1_entree_intern_temp'];
          if (!s || s.state === 'unavailable') return "N/A";
          return parseFloat(s.state).toFixed(1) + "°";
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 4px
          - padding: 1px 2px
          - cursor: pointer
          - height: 24px
          - min-height: 24px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
          - animation: |
              [[[
                const s = states['sensor.esp1_entree_intern_temp'];
                if (!s || s.state === 'unavailable') return "none";
                const value = parseFloat(s.state);
                return value >= 65 ? "blink 1s infinite" : "none";
              ]]]
        state:
          - font-size: 12px
          - font-weight: bold
  lux:
    card:
      type: custom:button-card
      entity: sensor.esp1_entree_lumiere1
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: mdi:brightness-5
      color: |
        [[[
          const s = states['sensor.esp1_entree_lumiere1'];
          if (!s || s.state === 'unavailable') return "grey";
          const value = parseInt(s.state);
          return value <= 100 ? "black" : value <= 200 ? "yellow" : "white";
        ]]]
      state_display: |
        [[[
          const s = states['sensor.esp1_entree_lumiere1'];
          if (!s || s.state === 'unavailable') return "N/A";
          return Math.round(parseInt(s.state)) + "lux";
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 4px
          - padding: 1px 2px
          - cursor: pointer
          - height: 24px
          - min-height: 24px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
        state:
          - font-size: 12px
          - font-weight: bold
  radar:
    card:
      type: custom:button-card
      entity: binary_sensor.esp1_entree_radar_target
      show_state: false
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: |
        [[[
          const s = states['binary_sensor.esp1_entree_radar_target'];
          if (!s || s.state === 'unavailable') return "mdi:help-network-outline";
          return s.state === 'on' ? "mdi:account-alert" : "mdi:account";
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 4px
          - padding: 1px 2px
          - cursor: pointer
          - height: 24px
          - min-height: 24px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
          - color: |
              [[[
                const s = states['binary_sensor.esp1_entree_radar_target'];
                if (!s || s.state === 'unavailable') return "grey";
                return s.state === 'on' ? "red" : "green";
              ]]]
          - animation: |
              [[[
                const s = states['binary_sensor.esp1_entree_radar_target'];
                if (!s || s.state === 'unavailable' || s.state === 'off') return "none";
                return "blink 1s infinite";
              ]]]
  status:
    card:
      type: custom:button-card
      entity: binary_sensor.esp1_entree_status
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: |
        [[[
          const s = states['binary_sensor.esp1_entree_status'];
          if (!s || s.state === 'unavailable') return "mdi:help-network-outline";
          return s.state === 'on' ? "mdi:check-network-outline" : "mdi:close-network-outline";
        ]]]
      state_display: |
        [[[
          const s = states['binary_sensor.esp1_entree_status'];
          if (!s || s.state === 'unavailable') return "Inconnu";
          return s.state === 'on' ? 'Connecté' : 'Hors ligne';
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 4px
          - padding: 1px 2px
          - cursor: pointer
          - height: 24px
          - min-height: 24px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
          - color: |
              [[[
                const s = states['binary_sensor.esp1_entree_status'];
                if (!s || s.state === 'unavailable') return "orange";
                return s.state === 'on' ? "green" : "red";
              ]]]
          - animation: |
              [[[
                const s = states['binary_sensor.esp1_entree_status'];
                if (!s || s.state === 'unavailable' || s.state === 'off') return "blink 1s infinite";
                return "none";
              ]]]
        state:
          - font-size: 12px
          - font-weight: bold
  mem:
    card:
      type: custom:button-card
      entity: sensor.esp1_entree_esp_free_memory
      show_state: true
      show_name: false
      show_icon: true
      layout: icon_state
      tap_action:
        action: more-info
      icon: mdi:memory
      color: |
        [[[
          const s = states['sensor.esp1_entree_esp_free_memory'];
          if (!s || s.state === 'unavailable') return "grey";
          const value = parseInt(s.state);
          return value < 80 ? "red" : value < 160 ? "orange" : "green";
        ]]]
      state_display: |
        [[[
          const s = states['sensor.esp1_entree_esp_free_memory'];
          if (!s || s.state === 'unavailable') return "N/A";
          return Math.round(parseFloat(s.state)) + "KB";
        ]]]
      styles:
        card:
          - box-shadow: none
          - background: transparent
          - border-radius: 4px
          - padding: 1px 2px
          - cursor: pointer
          - height: 24px
          - min-height: 24px
          - display: flex
          - align-items: center
          - justify-content: flex-start
        icon:
          - width: 17px
          - height: 17px
          - margin-right: 3px
          - animation: |
              [[[
                const s = states['sensor.esp1_entree_esp_free_memory'];
                if (!s || s.state === 'unavailable') return "none";
                const value = parseInt(s.state);
                return value < 80 ? "blink 1s infinite" : "none";
              ]]]
        state:
          - font-size: 12px
          - font-weight: bold

cdt

2 « J'aime »