[Mon Dashboard] - @felix62

Bonjour,

Liens vers le github : felix624/HomeAssistant at main · felix624/felix624 · GitHub

Après quelques mois sur le forum, j’ai décidé de présenter mon dashboard qui est minimaliste pour le moment mais chaque chose en son temps :slight_smile:

Ps: ma configuration home assistant est entiérement décomposé (+infos sur ce lien merci a @Tank )

Fonctionnalités :

Automatisations:

  • Purge de la BDD automatique
  • Prise Lexman zigbee (toute appareil mobile connecté arrivant a 90% la prise s’éteint)
  • Reboot auto de la prise du FAI si ping google ect… sans réponse. merci à @FillR2
  • Gestion des volets 4 Mode (Normal, Auto froid, Auto chauf, Manuel)
  • Notification Automatiques:
    • Rafraichissement Nocturne / Matinal : Notification durant l’été quand il est conseillé d’ouvrir ou fermé les fenêtre :slight_smile:
    • Alerte Météo
    • Anniversaire
    • Poubelle
    • Détection de mouvement
    • Onduleur (si coupure de courant ou reprise)
    • Fête du jour (éphéméride)
    • Alerte pluie attendu dans l’heure et inversement
    • Mise a jour dispo de HA ou HACS.

Bien d’autres fonction doivent arrivée:

  • Mesure de la consommation (eau, elec, gaz…) :white_check_mark:
  • Pilotage des volets (en cours)
  • Capteur boîtes à lettre
    ect…

Je vous avoue m’être inspiré de paradis artificiels avec certaines modifications.

Sujet / tuto rédiger:

Bonne Visite

sommaire

infosysteme

Badge Applications : (me permet d’ouvrir des iframes)

badge apps

Badge d’utilisateur:


meteo2
image

Le graphique donnant la température intérieur / extérieur est liés a une automatisation merci à @papoo (lien du github: home-assistant-config/integrations/alerte_rafraichissement_nocturne.yaml at master · papo-o/home-assistant-config · GitHub) pour le rafraichissement nocturne ou j’ai combiné en 1 seul automatisation pour Nocturne et matinal la voici:

Input_datetime

Input_datetime
   ############################################################
   ##                        SENSOR                          ##
   ############################################################
#sensor:
#   - platform: min_max  # https://www.home-assistant.io/integrations/min_max/
#     name: "Température moyenne étage"
#     type: mean
#     entity_ids:
#       - sensor.temperature_chambre_1
#       - sensor.temperature_chambre_2
#       - sensor.temperature_chambre_parents
#       - sensor.temperature_douche
#
#
#   - platform: min_max  # https://www.home-assistant.io/integrations/min_max/
#     name: "Température moyenne extérieure"
#     type: mean
#     entity_ids:
#       - sensor.temperature_anemometre
#       - sensor.temperature_exterieure_allee
#       - sensor.temperature_exterieure_terrasse


##############################################################################################################
###    INPUT_DATETIME    #####################################################################################
##############################################################################################################
input_datetime: 
# https://www.home-assistant.io/integrations/input_datetime/
##################################################################################
  night_cooling_last_notification_sent:
    has_date: true
  morning_cooling_last_notification_sent:
    has_date: true

Automatisation:

Automatisation
- id: Rafraîchissement Nocturne Matinal
  alias: Rafraichissement Nocturne Matinal
  trigger:
  - platform: time_pattern
    minutes: /5
    seconds: 0
  condition:
  - condition: and
    conditions:
    - condition: template
      value_template: '{{ now().month > 4 }}'
    - condition: template
      value_template: '{{ now().month < 10 }}'
  action:
  - choose:
    - conditions:
      - condition: template
        value_template: "{{\n  not is_state_attr('input_datetime.morning_cooling_last_notification_sent',
          'day', now().day) \n}}"
      - condition: template
        value_template: '{{ states.sensor.temperature.state | float(0) <= (states.sensor.xxxx_temperature.state
          | float(0) + 1) }}'
      - condition: template
        value_template: '{{ now().hour < 14 }}'
      - condition: template
        value_template: "{{\n  not is_state_attr('input_datetime.morning_cooling_last_notification_sent',
          'day', now().day) \n}}\n"
      sequence:
      - service: notify.notify
        data_template:
          message: "la Température intérieure {{ states.sensor.temperature.state | round
            | int(0) }} °C\U0001F321️ est inférieur/égal à la température extérieure {{
            states.sensor.xxx_temperature.state | round | int(0) }} °C\U0001F321️.
            Fermeture des fenêtres recommandée \U0001FA9F"
      - service: input_datetime.set_datetime
        entity_id: input_datetime.morning_cooling_last_notification_sent
        data_template:
          date: '{{ now().strftime(''%Y-%m-%d'') }}'
    - conditions:
      - condition: template
        value_template: '{{ (states.sensor.xxxx_temperature.state | float(0) ) >
          21 }}'
      - condition: template
        value_template: '{{ states.sensor.temperature.state | float(0) > (states.sensor.xxx_temperature.state
          | float(0) + 1) }}'
      - condition: template
        value_template: '{{ now().hour > 18 }}'
      - condition: template
        value_template: "{{\n  not is_state_attr('input_datetime.night_cooling_last_notification_sent',
          'day', now().day) \n}}\n"   
      sequence: 
      - service: notify.notify
        data_template:
          message: "la Température intérieure {{ states.sensor.temperature.state | round
            | int(0) }} °C\U0001F321️ est superieure à la température extérieure {{ states.sensor.xxxx_temperature.state
            | round | int(0) }} °C\U0001F321️. Ouverture des fenêtres recommandée \U0001FA9F"
      - service: input_datetime.set_datetime
        entity_id: input_datetime.night_cooling_last_notification_sent
        data_template:
          date: '{{ now().strftime(''%Y-%m-%d'') }}'     
    default: []

Page Informatique:

  • regroupant : (Synology, Onduleur, Pi-hole, Reseau)

Energie: (interface à améliorer :grin:)

Energie obtenue au module supplémentaire: Enedis & GRDF (2MQTT)
liens:

Page configuration:
peu fournit pour le moment mais reste très intuitif :slight_smile:

  • nouvelle fonction permettant d’envoyer des notifications sur apps mobile, google home alexa ect…

Automatisations:

Volets:

Groupes Cover:

Groupe cover

cover:   
   ############################################################
   ##                    COVERS GROUPS                       ##
   ############################################################
  - platform: group
    name: Volets de la maison
    entities:
      - cover.module_volet_salon
      - cover.module_volet_sejour
      
  - platform: group
    name: Volets orientés sud 
    entities:
      - cover.module_volet_salon
      #- cover.module_volet_salon
  - platform: group
    name: Volets orientés ouest
    entities:
      - cover.module_volet_sejour
      #- cover.module_volet_sejour


group:
   ############################################################
   ##                    ALL COVERS GROUPS                   ##
   ############################################################
  all_covers_home:
    name: Volets de la maison
    entities:
      - cover.module_volet_salon
      - cover.module_volet_sejour 

  all_covers_sud:
    name: Volets orientés sud
    entities:  
      - cover.module_volet_salon


  all_covers_ouest:
    name: Volets orientés ouest
    entities:  
      - cover.module_volet_sejour     
 
   ############################################################
   ##                     COVER COUNT                       ##
   ############################################################
sensor:
  - platform: template
    sensors:
      all_covers_home:
        value_template: >
          {{ states | selectattr('entity_id', 'in', state_attr('cover.volets_de_la_maison', 'entity_id')) |selectattr('state') | list | count}}
      all_covers_sud:
        value_template: >
          {{ states | selectattr('entity_id', 'in', state_attr('cover.volets_orientes_sud', 'entity_id')) |selectattr('state') | list | count}}

      all_covers_ouest:
        value_template: >
          {{ states | selectattr('entity_id', 'in', state_attr('cover.volets_orientes_ouest', 'entity_id')) |selectattr('state') | list | count}}
            
automation: 
   ############################################################
   ##                  COVER COUNT UPDATE                   ##
   ############################################################         
  - alias: 'Mise a jour all_cover'
    mode: single
    max_exceeded: silent
    initial_state: 'on'
    trigger:    
      - platform: state
        entity_id: 
          - group.all_covers_home
    action:
      - service: homeassistant.update_entity
        data_template:
          entity_id: group.all_covers_home 

Binary _sensor:

############################
###    BINARY_SENSOR     ###
############################

binary_sensor:
  - platform: threshold
    name: "soleil volets sud"
    upper: 250
    lower: 90
    entity_id: sensor.sunazimuth
  - platform: threshold
    name: "soleil volets ouest"
    upper: 270
    lower: 180
    entity_id: sensor.sunazimuth
    #on a donc créé une entité qui sera active si la valeur de sensor.sunazimuth est supérieure à 180 et inférieure à 270

Menu input_select: (configuration.yaml)
Ps: j’utilise personnelement la decomposition de mon fichier config.yaml grace à:
input_select: !include_dir_merge_named input_select/
Pour ceux qui l’intégre directement dans leur fichier configuration.yaml il vous faudra ajouter en debut de ligne inpu_select:
Comme ceci: voir sur le site officiel home assistant

# Example configuration.yaml entry
input_select:
  who_cooks:
    name: Who cooks today
    options:
      - Paulus
      - Anne Therese
    initial: Anne Therese
    icon: mdi:panda
  living_room_preset:
    options:
      - Visitors
      - Visitors with kids
      - Home Alone
############################
###     Input_select     ###
############################
mode_volet:
  name: mode volet principale
  options:
    - Normal
    - Auto chauf
    - Auto froid
    - Manuel
modevoletsud:
  name: mode volet sud
  options:
    - Normal
    - Auto chauf
    - Auto froid
    - Manuel
modevoletouest:
  name: mode volet ouest
  options:
    - Normal
    - Auto chauf
    - Auto froid
    - Manuel

Code de l’automatisation enfin :slight_smile:
image

Petite resemblance:
image

automatisation
- id: '1659956456360'
  alias: Volet
  description: ''
  trigger:
  - platform: sun
    event: sunrise
  - platform: sun
    event: sunset
  - platform: state
    entity_id:
    - sensor.XX_weather_alert
    attribute: Canicule
  - platform: state
    entity_id:
    - input_select.mode_volet
    id: Mode
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - platform: state
    entity_id:
    - sensor.time_2
  condition: []
  action:
  - choose:
    - conditions:
      - condition: trigger
        id: Mode
      sequence:
      - service: input_select.select_option
        data_template:
          entity_id:
          - input_select.modevoletsud
          - input_select.modevoletouest
          option: '{{ states(''input_select.mode_volet'') }}'
    - conditions:
      - condition: sun
        after: sunset
        after_offset: 00:00:00
      - condition: or
        conditions:
        - condition: state
          entity_id: group.all_covers_ouest
          state: open
        - condition: state
          entity_id: group.all_covers_sud
          state: open
        enabled: false
      - condition: not
        conditions:
        - condition: state
          entity_id: input_select.mode_volet
          state: Manuel
      sequence:
      - service: cover.close_cover
        data: {}
        target:
          entity_id:
          - cover.volets_orientes_ouest
          - cover.volets_orientes_sud
    - conditions:
      - condition: sun
        after: sunrise
        after_offset: 00:00:00
        before: sunset
      - condition: not
        conditions:
        - condition: state
          state: 'on'
          entity_id: binary_sensor.soleil_volets_ouest
        - condition: state
          entity_id: cover.volets_orientes_ouest
          state: open
          enabled: false
      - condition: state
        entity_id: input_select.modevoletouest
        state: Auto froid
      - condition: state
        entity_id: sensor.XX_weather_alert
        attribute: Canicule
        state: Vert
      sequence:
      - service: cover.set_cover_position
        data:
          position: 100
        target:
          entity_id: cover.volets_orientes_ouest
    - conditions:
      - condition: sun
        before: sunset
        after: sunrise
        after_offset: 00:00:00
      - condition: not
        conditions:
        - condition: state
          entity_id: binary_sensor.soleil_volets_sud
          state: 'on'
        - condition: state
          state: open
          entity_id: group.all_covers_sud
          enabled: false
      - condition: and
        conditions:
        - condition: state
          entity_id: input_select.modevoletsud
          state: Auto froid
        - condition: state
          entity_id: sensor.XX_weather_alert
          attribute: Canicule
          state: Vert
      sequence:
      - service: cover.set_cover_position
        data:
          position: 100
        target:
          entity_id: cover.volets_orientes_sud
    - conditions:
      - condition: state
        entity_id: binary_sensor.soleil_volets_sud
        state: 'on'
      - condition: and
        conditions:
        - condition: state
          entity_id: input_select.modevoletsud
          state: Auto froid
        - condition: device
          device_id: 012fbd33f6b7cc0f9b5237f2a376a5a8
          domain: cover
          entity_id: cover.module_volet_salon
          type: is_position
          above: 50
      sequence:
      - service: cover.set_cover_position
        data:
          position: 0
        target:
          entity_id: cover.volets_orientes_sud
    - conditions:
      - condition: state
        entity_id: binary_sensor.soleil_volets_ouest
        state: 'on'
      - condition: and
        conditions:
        - condition: state
          entity_id: input_select.modevoletouest
          state: Auto froid
        - condition: state
          state: open
          entity_id: group.all_covers_ouest
          enabled: false
      sequence:
      - service: cover.set_cover_position
        data:
          position: 0
        target:
          entity_id: cover.volets_orientes_ouest
    - conditions:
      - condition: state
        state: Normal
        entity_id: input_select.mode_volet
      - condition: sun
        before: sunset
        after: sunrise
      - condition: or
        conditions:
        - condition: state
          entity_id: group.all_covers_sud
          state: closed
        - condition: state
          entity_id: group.all_covers_ouest
          state: closed
        enabled: false
      sequence:
      - service: cover.set_cover_position
        data:
          position: 100
        target:
          entity_id:
          - cover.volets_orientes_ouest
          - cover.volets_orientes_sud
    - conditions:
      - condition: sun
        before: sunset
        after: sunrise
      - condition: state
        state: Auto chauf
        entity_id: input_select.mode_volet
      - condition: or
        conditions:
        - condition: state
          entity_id: group.all_covers_ouest
          state: open
        - condition: state
          entity_id: group.all_covers_sud
          state: open
        enabled: false
      sequence:
      - service: cover.close_cover
        data: {}
        target:
          entity_id:
          - cover.volets_orientes_sud
          - cover.volets_orientes_ouest
    default: []
7 « J'aime »

Merci pour ton partage, ça donne des idées.
J’aime bien ton écran d’acceuil (surtout la blague du jour :joy:)
Mais ta carte pour le Syno est vraiment sympa :slightly_smiling_face:, alors si cela ne te dérange pas partager le code , je suis preneur :grin:

config.yaml

sun:
zodiac:
python_script:

Sensor date du jour complete:

- platform: template
  sensors:
    date_fr_complete:
      value_template: "{{states.sensor.jour_fr.state }} {% set months = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'] %} {{ now().day | string + ' ' + months[now().month-1]}} {{now().year }}"
      friendly_name: "Date"
      icon_template: mdi:calendar

Saison: (vivaldi :p)

  - platform: season

Rest Json fete du jour:

- platform: rest
  resource: https://fetedujour.fr/api/v2/7vCo4ALjRbwP35cv/json
  name: Fete du jour
  value_template: "{{ value_json.name }}"

Ou en python:

""" https://pon.fr/home-assistant-infos-du-jour-et-du-lendemain/ """
""" https://github.com/papo-o/home-assistant-config/blob/master/python_scripts/jours_feries.py """


"""  This script creates sensors that will display the saints of the day   """
"""      and the day after, of the possible holidays and birthdays         """
"""          of the day and the day after. For the birdays it              """
"""              will return years as an attribute                         """

"""       Requires python_script: to be enabled in you configuration       """

""" Usage:                                                                 """
"""                                                                        """
""" automation:                                                            """
"""   alias: Refresh jours feries sensors                                  """
"""   trigger:                                                             """
"""     platform: time                                                     """
"""     at: '00:00:01'                                                     """
"""   action:                                                              """
"""     service: python_script.jours_feries                                """
"""     data:                                                              """
"""       name: "jours_feries"                                             """


""" This will create 6 sensors. two for saints, two for publics hollidays, """
"""    mother and father days, grandmother and grandfather days and two    """
"""      for birthday. One for today and the other for tomorrow            """
"""         the attribute 'age' will show the number of years              """

"""       example to display sensors with the auto-entities card           """

"""    - type: custom:auto-entities                                        """
"""      card:                                                             """
"""        type: entities                                                  """
"""        title: "Infos du jour"                                          """
"""        show_header_toggle: false                                       """
"""      filter:                                                           """
"""        include:                                                        """
"""          - entity_id: /saint/                                          """
"""          - entity_id: /_ferie/                                         """
"""          - entity_id: /_anniversaire/                                  """
"""        exclude:                                                        """
"""          - state: "unavailable"                                        """

today = datetime.datetime.now().date()
aujourdhui = today.day
demain = int(aujourdhui) + 1
mois = today.month
annee = today.year
day = '{:02d}'.format(today.day)
tomorrow = '{:02d}'.format((today + datetime.timedelta(days=1)).day)
month = '{:02d}'.format(today.month)
feteaujourdhui = day+":"+month
fetedemain = tomorrow+":"+month

def listeanniversaires(an):
    """Liste des anniversaires"""
    F = []  # =liste des dates des anniversaires en date-liste d=[j,m,a]
    L = []  # =liste des libelles des anniversaires

    d = [20,6,1988] 
    F.append(d)
    L.append(u"de roseline bachelot")
    
    d = [2,8,1991] 
    F.append(d)
    L.append(u"de cop")

    d = [21,7,2017] 
    F.append(d)
    L.append(u"")
    
    return F, L

def estanniversaire(d):
    """estferie(d): => dit si une date d=[j,m,a] donnée est un anniversaire
       si la date est un anniversaire, renvoie son libellé
       sinon, renvoie "unavailable" afin de masquer le sensor"""
    j,m,a = d
    F,L = listeanniversaires(a)
    for i in range(0, len(F)):
        if j==F[i][0] and m==F[i][1]:
            a=F[i][2]
            years = annee - int(a)
            return L[i], years
    return "unavailable" , ""

annivjour, agejour = estanniversaire([aujourdhui,mois,annee])
annivdemain, agedemain = estanniversaire([demain,mois,annee])

"""The syntax is hass.states.set(entitiy_id, state, {dict of attributes}) """
hass.states.set("sensor.jour_anniversaire" , annivjour ,
  {
    "icon" : "mdi:calendar-star" ,
    "friendly_name" : "Aujourd'hui c'est l'anniversaire ",
    "années" : agejour
  }
)

hass.states.set("sensor.demain_anniversaire" , annivdemain ,
  {
    "icon" : "mdi:calendar-star" ,
    "friendly_name" : "Demain c'est l'anniversaire ",
    "années" : agedemain
  }
)

"""              Calcul des jours fériés                 """

def datepaques(an):
    """Calcule la date de Pâques d'une année donnée an (=nombre entier)"""
    a=an//100
    b=an%100
    c=(3*(a+25))//4
    d=(3*(a+25))%4
    e=(8*(a+11))//25
    f=(5*a+b)%19
    g=(19*f+c-e)%30
    h=(f+11*g)//319
    j=(60*(5-d)+b)//4
    k=(60*(5-d)+b)%4
    m=(2*j-k-g+h)%7
    n=(g-h+m+114)//31
    p=(g-h+m+114)%31
    jour=p+1
    mois=n
    return [jour, mois, an]

""" la fête des grands-mères est fixée au premier dimanche de mars"""
""" calcul du jour de la fête de mères"""
""" la fête des mères est fixée au dernier dimanche de mai sauf si cette date coïncide avec celle de la Pentecôte"""
""" auquel cas elle a lieu le premier dimanche de juin."""
""" la fête des pères est fixée au 3e dimanche de juin."""
""" Pentecôte = Pâques + 49 jours """
""" la fête des grands-pères est fixée au premier dimanche d'octobre"""

def bissextile(annee):
    if (annee % 4) == 0:
        if (annee % 100) == 0:
            if (annee % 400) == 0:
                joursFevrier = 29
            else:
                joursFevrier = 28
        else:
            joursFevrier = 29
    else:
        joursFevrier = 28
    return joursFevrier

def listejoursferies(an):
    """Liste des jours fériés France en date-liste de l'année an (nb entier)."""
    F = []  # =liste des dates des jours feries en date-liste d=[j,m,a]
    L = []  # =liste des libelles du jour ferie
    dp = datepaques(an)
    jdp,mdp,adp = dp

    # Jour de l'an
    d = [1,1,an]
    F.append(d)
    L.append(u"Jour de l'an")

    # # Jour de test
    # d = [3,5,an]
    # F.append(d)
    # L.append(u"Jour de papoo")

    # # Jour de test
    # d = [4,5,an]
    # F.append(d)
    # L.append(u"Jour de papoo1")

    # premier dimanche de mars
    derJourFev = datetime.date(an, 2, bissextile(an)).isocalendar()[2]
    if derJourFev>6:
        derJourFev=0
    #premDimMar = [7-derJourFev,3,an]
    d = [7-derJourFev,3,annee]
    F.append(d)
    L.append(u"Fête des grands-mères")
    
    # Dimanche de Paques
    d = dp
    F.append(d)
    L.append(u"Dimanche de Pâques")

    # Lundi de Paques
    d = [jdp+1,mdp,adp]
    F.append(d)
    L.append(u"Lundi de Pâques")

    # Fête du travail
    d = [1,5,an]
    F.append(d)
    L.append(u"Fête du travail")

    # Victoire des allies 1945
    d = [8,5,an]
    F.append(d)
    L.append(u"Victoire des alliés 1945")

    # Jeudi de l'Ascension
    d = [jdp+9,mdp+1,adp]
    F.append(d)
    L.append(u"Jeudi de l'Ascension")

    # Dimanche de Pentecote
    d = [jdp+19,mdp+1,adp]
    F.append(d)
    L.append(u"Pentecôte")

    # Lundi de Pentecote
    d = [jdp+20,mdp+1,adp]
    F.append(d)
    L.append(u"Lundi de Pentecôte")

    # Fete des mères
    derJourMai = datetime.date(an, 5, 31).isocalendar()[2]
    if derJourMai>6:
        derJourMai=0
    derDimMai = [31-derJourMai,5,an]
    premDimJuin = [7-derJourMai,6,an]
    if derDimMai == [jdp+19,mdp+1,adp]:
        d = premDimJuin
    else:
        d = derDimMai
    F.append(d)
    L.append(u"Fête des mères")

    # Fete des pères
    d = [21-derJourMai,6,an]
    F.append(d)
    L.append(u"Fête des pères")

    # Fete Nationale
    d = [14,7,an]
    F.append(d)
    L.append(u"Fête Nationale")

    # Assomption
    d = [15,8,an]
    F.append(d)
    L.append(u"Assomption")

    # premier dimanche d'octobre
    derJourSep = datetime.date(an, 9, 30).isocalendar()[2]
    if derJourSep>6:
        derJourSep=0
    #premDimOct = [7-derJourSep,3,an]
    d = [7-derJourSep,10,an]
    F.append(d)
    L.append(u"Fête des grands-pères")

    # Toussaint
    d = [1,11,an]
    F.append(d)
    L.append(u"Toussaint")

    # Armistice 1918
    d = [11,11,an]
    F.append(d)
    L.append(u"Armistice 1918")

    # Jour de Noel
    d = [25,12,an]
    F.append(d)
    L.append(u"Jour de Noël")

    return F, L

def estferie(d):
    """estferie(d): => dit si une date d=[j,m,a] donnée est fériée France
       si la date est fériée, renvoie son libellé
       sinon, renvoie "unavailable" afin de masquer le sensor"""
    j,m,a = d
    F,L = listejoursferies(a)
    for i in range(0, len(F)):
        if j==F[i][0] and m==F[i][1] and a==F[i][2]:
            return L[i]
    return "unavailable" 

"""The syntax is hass.states.set(entitiy_id, state, {dict of attributes}) """
hass.states.set("sensor.jour_ferie" , estferie([aujourdhui,mois,annee]) ,
  {
    "icon" : "mdi:creation" ,
    "friendly_name" : "Férié aujourd'hui"
  }
)

hass.states.set("sensor.demain_ferie" , estferie([demain,mois,annee]),
  {
    "icon" : "mdi:creation" ,
    "friendly_name" : "Férié demain"
  }
)

"""  Fête du jour et du lendemain, ne pas supprimer de date  """
fetes = {
    "01:01" : "Ugolin",
    "02:01" : "Basile",
    "03:01" : "Geneviève",
    "04:01" : "Odilon",
    "05:01" : "Édouard",
    "06:01" : "André",
    "07:01" : "Raymond",
    "08:01" : "Lucien",
    "09:01" : "Alix de Ch",
    "10:01" : "Guillaume",
    "11:01" : "Paulin d Aquilee",
    "12:01" : "Tatiana",
    "13:01" : "Yvette",
    "14:01" : "Nina",
    "15:01" : "Rémi",
    "16:01" : "Marcel",
    "17:01" : "Roseline",
    "18:01" : "Prisca",
    "19:01" : "Marius",
    "20:01" : "Sébastien",
    "21:01" : "Agnès",
    "22:01" : "Vincent",
    "23:01" : "Barnard",
    "24:01" : "François",
    "25:01" : "onversion de Paul",
    "26:01" : "Paule",
    "27:01" : "Angèle",
    "28:01" : "Thomas",
    "29:01" : "Gildas",
    "30:01" : "Martine",
    "31:01" : "Marcelle",
    "01:02" : "Ella",
    "02:02" : "Theophane",
    "03:02" : "Blaise",
    "04:02" : "Véronique",
    "05:02" : "Agathe",
    "06:02" : "Gaston",
    "07:02" : "Eugénie",
    "08:02" : "Jacqueline",
    "09:02" : "Apolline",
    "10:02" : "Arnaud",
    "11:02" : "Severin",
    "12:02" : "Felix",
    "13:02" : "Beatrice",
    "14:02" : "Valentin",
    "15:02" : "Claude",
    "16:02" : "Julienne",
    "17:02" : "Alexis",
    "18:02" : "Bernadette",
    "19:02" : "Gabin",
    "20:02" : "Aimee",
    "21:02" : "Damien",
    "22:02" : "Isabelle",
    "23:02" : "Lazare",
    "24:02" : "Modeste",
    "25:02" : "Romeo",
    "26:02" : "Nestor",
    "27:02" : "Honorine",
    "28:02" : "Romain",
    "29:02" : "Augula",
    "01:03" : "Aubin",
    "02:03" : "Charles",
    "03:03" : "Gwenole",
    "04:03" : "Casimir",
    "05:03" : "Olive",
    "06:03" : "Colette",
    "07:03" : "Félicité",
    "08:03" : "Jean",
    "09:03" : "Françoise",
    "10:03" : "Vivien",
    "11:03" : "Rosine",
    "12:03" : "Justine",
    "13:03" : "Rodrigue",
    "14:03" : "Maud",
    "15:03" : "Louise",
    "16:03" : "Benedicte",
    "17:03" : "Patrick",
    "18:03" : "Cyrille",
    "19:03" : "Joseph",
    "20:03" : "Herbert",
    "21:03" : "Clemence",
    "22:03" : "Lea",
    "23:03" : "Victorien",
    "24:03" : "Catherine",
    "25:03" : "Humbert",
    "26:03" : "Larissa",
    "27:03" : "Habib",
    "28:03" : "Gontran",
    "29:03" : "Gwladys",
    "30:03" : "Amedee",
    "31:03" : "Benjamin",
    "01:04" : "Hugues",
    "02:04" : "Sandrine",
    "03:04" : "Richard",
    "04:04" : "Isidore",
    "05:04" : "Irene",
    "06:04" : "Marcellin",
    "07:04" : "Jean-Baptiste",
    "08:04" : "Julie",
    "09:04" : "Gautier",
    "10:04" : "Fulbert",
    "11:04" : "Stanislas",
    "12:04" : "Jules 1er",
    "13:04" : "Ida",
    "14:04" : "Maxime",
    "15:04" : "Paterne",
    "16:04" : "Benoît",
    "17:04" : "Étienne",
    "18:04" : "Parfait",
    "19:04" : "Emma",
    "20:04" : "Odette",
    "21:04" : "Anselme",
    "22:04" : "Alexandre",
    "23:04" : "Georges",
    "24:04" : "Fidèle",
    "25:04" : "Marc",
    "26:04" : "Alida",
    "27:04" : "Zita",
    "28:04" : "Valérie",
    "29:04" : "Catherine",
    "30:04" : "Robert",
    "01:05" : "Joseph",
    "02:05" : "Boris",
    "03:05" : "Philippe",
    "04:05" : "Sylvain",
    "05:05" : "Judith",
    "06:05" : "Prudence",
    "07:05" : "Gisèle",
    "08:05" : "Desire",
    "09:05" : "Pacôme",
    "10:05" : "Solange",
    "11:05" : "Estelle",
    "12:05" : "Achille",
    "13:05" : "Rolande",
    "14:05" : "Matthias",
    "15:05" : "Denise",
    "16:05" : "Honore",
    "17:05" : "Pascal",
    "18:05" : "Éric",
    "19:05" : "Yves",
    "20:05" : "Bernardin",
    "21:05" : "Constantin",
    "22:05" : "Émile",
    "23:05" : "Didier",
    "24:05" : "Donatien",
    "25:05" : "Sophie",
    "26:05" : "Bérenger",
    "27:05" : "Augula",
    "28:05" : "Germain",
    "29:05" : "Aymard",
    "30:05" : "Ferdinand",
    "31:05" : "Perrine",
    "01:06" : "Justin",
    "02:06" : "Blandine",
    "03:06" : "Charles",
    "04:06" : "Clotilde",
    "05:06" : "Igor",
    "06:06" : "Norbert",
    "07:06" : "Gilbert",
    "08:06" : "Médard",
    "09:06" : "Diane",
    "10:06" : "Landry",
    "11:06" : "Barnabé",
    "12:06" : "Guy",
    "13:06" : "Antoine",
    "14:06" : "Élisée",
    "15:06" : "Germaine",
    "16:06" : "Jean-François",
    "17:06" : "Hervé",
    "18:06" : "Leonce",
    "19:06" : "Romuald",
    "20:06" : "Silvère",
    "21:06" : "Rodolphe",
    "22:06" : "Alban",
    "23:06" : "Audrey",
    "24:06" : "Jean-Baptiste",
    "25:06" : "Prosper",
    "26:06" : "Anthelme",
    "27:06" : "Fernand",
    "28:06" : "Irénée",
    "29:06" : "Pierre et Paul",
    "30:06" : "Martial",
    "01:07" : "Thierry",
    "02:07" : "Martinien",
    "03:07" : "Thomas",
    "04:07" : "Florent",
    "05:07" : "Antoine",
    "06:07" : "Mariette",
    "07:07" : "Raoul",
    "08:07" : "Thibaud",
    "09:07" : "Amandine",
    "10:07" : "Ulric",
    "11:07" : "Benoit",
    "12:07" : "Olivier",
    "13:07" : "Joëlle",
    "14:07" : "Camille",
    "15:07" : "Donald",
    "16:07" : "Elvire",
    "17:07" : "Charlotte",
    "18:07" : "Frédéric",
    "19:07" : "Arsène",
    "20:07" : "Marina",
    "21:07" : "Victor",
    "22:07" : "Marie-Madeleine",
    "23:07" : "Brigitte",
    "24:07" : "Christine",
    "25:07" : "Jacques",
    "26:07" : "Anne",
    "27:07" : "Nathalie",
    "28:07" : "Samson",
    "29:07" : "Marthe",
    "30:07" : "Juliette",
    "31:07" : "Ignace",
    "01:08" : "Alphonse",
    "02:08" : "Julien",
    "03:08" : "Lydie",
    "04:08" : "Jean-Marie",
    "05:08" : "Abel",
    "06:08" : "Octavien",
    "07:08" : "Gaetan",
    "08:08" : "Dominique",
    "09:08" : "Amour",
    "10:08" : "Laurent",
    "11:08" : "Claire",
    "12:08" : "Clarisse",
    "13:08" : "Hippolyte",
    "14:08" : "Evrard",
    "15:08" : "Marie",
    "16:08" : "Armel",
    "17:08" : "Hyacinthe",
    "18:08" : "Hélène",
    "19:08" : "Eudes",
    "20:08" : "Bernard",
    "21:08" : "Christophe",
    "22:08" : "Fabrice",
    "23:08" : "Rose",
    "24:08" : "Barthélemy",
    "25:08" : "Louis",
    "26:08" : "Natacha",
    "27:08" : "Monique",
    "28:08" : "Augustin",
    "29:08" : "Sabine",
    "30:08" : "Fiacre",
    "31:08" : "Aristide",
    "01:09" : "Gilles",
    "02:09" : "Ingrid",
    "03:09" : "Grégoire",
    "04:09" : "Rosalie",
    "05:09" : "Raïssa",
    "06:09" : "Bertrand",
    "07:09" : "Reine",
    "08:09" : "Adrien",
    "09:09" : "Alain",
    "10:09" : "Inès",
    "11:09" : "Adelphe",
    "12:09" : "Apollinaire",
    "13:09" : "Aime",
    "14:09" : "Lubin",
    "15:09" : "Roland",
    "16:09" : "Édith",
    "17:09" : "Renaud",
    "18:09" : "Nadège",
    "19:09" : "Émilie",
    "20:09" : "Davy",
    "21:09" : "Matthieu",
    "22:09" : "Maurice",
    "23:09" : "Constant",
    "24:09" : "Thecle",
    "25:09" : "Hermann",
    "26:09" : "Damien",
    "27:09" : "Vincent",
    "28:09" : "Venceslas",
    "29:09" : "Michel",
    "30:09" : "Jérôme",
    "01:10" : "Thérèse",
    "02:10" : "Léger",
    "03:10" : "Gérard",
    "04:10" : "François",
    "05:10" : "Fleur",
    "06:10" : "Bruno",
    "07:10" : "Serge",
    "08:10" : "Pélagie",
    "09:10" : "Denis",
    "10:10" : "Ghislain",
    "11:10" : "Firmin",
    "12:10" : "Wilfrid",
    "13:10" : "Géraud",
    "14:10" : "Juste",
    "15:10" : "Thérèse",
    "16:10" : "Edwige",
    "17:10" : "Baudouin",
    "18:10" : "Luc",
    "19:10" : "René Goupil",
    "20:10" : "Lina",
    "21:10" : "Céline",
    "22:10" : "Elodie",
    "23:10" : "Jean",
    "24:10" : "Florentin",
    "25:10" : "Crépin",
    "26:10" : "Dimitri",
    "27:10" : "Émeline",
    "28:10" : "Simon",
    "29:10" : "Narcisse",
    "30:10" : "Bienvenue",
    "31:10" : "Quentin",
    "01:11" : "Dagobert",
    "02:11" : "defunts",
    "03:11" : "Hubert",
    "04:11" : "Charles",
    "05:11" : "Sylvie",
    "06:11" : "Bertille",
    "07:11" : "Carine",
    "08:11" : "Geoffroy",
    "09:11" : "Theodore",
    "10:11" : "Leon",
    "11:11" : "Martin",
    "12:11" : "Christian",
    "13:11" : "Brice",
    "14:11" : "Sidoine",
    "15:11" : "Albert",
    "16:11" : "Marguerite",
    "17:11" : "Élisabeth",
    "18:11" : "Aude",
    "19:11" : "Tanguy",
    "20:11" : "Edmond",
    "21:11" : "Albert",
    "22:11" : "Cécile",
    "23:11" : "Clement",
    "24:11" : "Flora",
    "25:11" : "Catherine",
    "26:11" : "Delphine",
    "27:11" : "Severin",
    "28:11" : "Jacques",
    "29:11" : "Saturnin",
    "30:11" : "Andre",
    "01:12" : "Florence",
    "02:12" : "Viviane",
    "03:12" : "Xavier",
    "04:12" : "Barbara",
    "05:12" : "Gerald",
    "06:12" : "Nicolas",
    "07:12" : "Ambroise",
    "08:12" : "Elfie",
    "09:12" : "Pierre",
    "10:12" : "Romaric",
    "11:12" : "Daniel",
    "12:12" : "Chantal",
    "13:12" : "Lucie",
    "14:12" : "Odile",
    "15:12" : "Ninon",
    "16:12" : "Alice",
    "17:12" : "Gael",
    "18:12" : "Gatien",
    "19:12" : "Urbain",
    "20:12" : "Theophile",
    "21:12" : "Pierre",
    "22:12" : "Xaviere",
    "23:12" : "Armand",
    "24:12" : "Adele",
    "26:12" : "Etienne",
    "27:12" : "Jean",
    "28:12" : "Innocents",
    "29:12" : "David",
    "30:12" : "Roger",
    "31:12" : "Sylvestre"
        }

"""The syntax is hass.states.set(entitiy_id, state, {dict of attributes}) """
hass.states.set("sensor.saint_du_jour" , fetes[feteaujourdhui] ,
  {
    "icon" : "mdi:church" ,
    "friendly_name" : "Saint du jour"
  }
)

hass.states.set("sensor.saint_de_demain" , fetes[fetedemain] ,
  {
    "icon" : "mdi:church" ,
    "friendly_name" : "Saint de demain"
  }
)

Code Lovelace

####################################################################################################################################################################################################################################################################################################################################################
####    SUMMARY
###############################################################################################################################################################
summary:
  card:  
    type: markdown
    card_mod: 
      style: |
        ha-card {
          font-size: 17px;
          font-family: Quicksand;
          height: 25px;
          background: none;
          margin-top: -0.2em;
          margin-left: -5px;
          margin-bottom: -1em;
          box-shadow: none;
        }
    content: >
            <center>  <b>{% if is_state('sensor.season', 'spring')%} 🌻 &nbsp;Printemps&nbsp; 🌻
                {% elif is_state('sensor.season', 'summer')%} 🌴 &nbsp;Eté&nbsp; 🌴
                {% elif is_state('sensor.season', 'autumn')%} 🍂 &nbsp;Automne&nbsp; 🍂 
                {% elif is_state('sensor.season', 'winter')%} ❄️ &nbsp;Hiver&nbsp; ❄️ 
                {% else %} Erreur Saison {% endif %} <center> </b>
            <center>  {{ states('sensor.date_fr_complete') }} <center> 
            <center> ☀️  Levé   {{ as_timestamp(states.sun.sun.attributes.next_rising) | timestamp_custom(' %H:%M') | replace(" 0", "") }} 
            &nbsp;🌙 Couché   {{ as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom(' %H:%M') | replace(" 0", "") }} <center> 
            <center>{% if is_state('sensor.zodiac', 'gemini')%}<ha-icon icon="mdi:zodiac-gemini"></ha-icon>  &nbsp;Gémeaux&nbsp;
                {% elif is_state('sensor.zodiac', 'aries')%} <ha-icon icon="mdi:zodiac-aries"></ha-icon>  &nbsp;Bélier&nbsp; 
                {% elif is_state('sensor.zodiac', 'taurus')%} <ha-icon icon="mdi:zodiac-taurus"></ha-icon>  &nbsp;Taureau&nbsp; 
                {% elif is_state('sensor.zodiac', 'cancer')%} <ha-icon icon="mdi:zodiac-cancer"></ha-icon>  &nbsp;Cancer&nbsp; 
                {% elif is_state('sensor.zodiac', 'leo')%} <ha-icon icon="mdi:zodiac-leo"></ha-icon>  &nbsp;Lion&nbsp; 
                {% elif is_state('sensor.zodiac', 'virgo')%} <ha-icon icon="mdi:zodiac-virgo"></ha-icon>  &nbsp;Vierge&nbsp; 
                {% elif is_state('sensor.zodiac', 'libra')%} <ha-icon icon="mdi:zodiac-libra"></ha-icon>  &nbsp;Balance&nbsp; 
                {% elif is_state('sensor.zodiac', 'scorpio')%} <ha-icon icon="mdi:zodiac-scorpio"></ha-icon>  &nbsp;Scorpion&nbsp; 
                {% elif is_state('sensor.zodiac', 'sagittarius')%} <ha-icon icon="mdi:zodiac-sagittarius"></ha-icon>  &nbsp;Sagittaire&nbsp; 
                {% elif is_state('sensor.zodiac', 'capricorn')%} <ha-icon icon="mdi:zodiac-capricorn"></ha-icon>  &nbsp;Capricorne&nbsp; 
                {% elif is_state('sensor.zodiac', 'aquarius')%} <ha-icon icon="mdi:zodiac-aquarius"></ha-icon>  &nbsp;Verseau&nbsp; 
                {% elif is_state('sensor.zodiac', 'pisces')%} <ha-icon icon="mdi:zodiac-pisces"></ha-icon>  &nbsp;Poissons&nbsp; 
                {% else %} Erreur Astrologie {% endif %} <center> </b>
                
            <center>{% if not is_state('sensor.jour_ferie', 'unavailable')%} Jour férié : {{ states('sensor.jour_ferie') }}
                    {% elif not is_state('sensor.demain_ferie', 'unavailable')%} Demain jour férié : {{ states('sensor.demain_ferie') }}{% endif %}<center>
                    
            <center><i> 🎉 &nbsp; Nous fêtons la Saint </i>{{ states('sensor.saint_du_jour') }} &nbsp; 🎉 <center>
            <center><i> &nbsp; Demain, nous fêterons la Saint </i>{{ states('sensor.saint_de_demain') }} &nbsp; <center>

Scrape: (blague du jour)

- platform: scrape
    name: blague du jour (1)
    resource: https://jokes-de-papa.com/blagues-courtes/blague-du-jour/
    select: ".elementor-element-25014ec > div:nth-child(1) > p:nth-child(1)"
    scan_interval: 300

  - platform: scrape
    name: blague du jour (2)
    resource: https://jokes-de-papa.com/blagues-courtes/blague-du-jour/
    select: ".elementor-element-25014ec > div:nth-child(1) > p:nth-child(2)"   
    scan_interval: 3600

card lovelace blague du jour:

####################################################################################################################################################################################################################################################################################################################################################
####    BLAGUE DU JOUR
#######################################################################################################################################################################################
joke:
  card:
    type: markdown
    card_mod: 
      style: |
        ha-card {
          font-size: 17px;
          font-family: Quicksand;
          height: 30px;
          background: none;
          margin-top: -1em;
          margin-left: -5px;
          margin-bottom: -0.3em;
          padding: 0 0 0 0;
          box-shadow: none;
        }
        .no-header {
           padding-top: 0px;
        }
    content: >  
                <center>  {% if not is_state('sensor.blague_du_jour_1', 'unknown') and not is_state('sensor.blague_du_jour_2', 'unknown')%} {{ states('sensor.blague_du_jour_1') }}{{ states('sensor.blague_du_jour_2') }}
                  {% elif not is_state('sensor.blague_du_jour_1', 'unknown')%} {{ states('sensor.blague_du_jour_1') }}{% endif %}<center>

===========================================================
Card lovelace synology

####################################################################################################################################################################################################################################################################################################################################################
#### SYNOLOGY
###############################################################################################################################################################
      - type: custom:stack-in-card  
        card_mod: 
          style: |
            ha-card {
              margin-top: 0em;
                }         
        mode: vertical
        cards: 
          - type: picture-entity
            entity: binary_sensor.synology_security_status
            image: /local/images/synology.jpg
            show_name: true
            show_state: false
            name: Synology DS920+
            state_image: 
              "Sécurisé": /local/images/synology.jpg
              "off": /local/images/synology.jpg
            tap_action:
              action: url
              confirmation:
                text: de vouloir aller sur le site synology
              url_path: "https://synology.com"
            hold_action:
              action: none
          - type: 'custom:mini-graph-card'
            card_mod: 
              style: |
                ha-card {
                  font-family: var(--primary-font-family);
                  margin-bottom: -10px;
                }
                .graph {
                  padding-top: 0px;
                  padding-bottom: 0px;
                }
                .info {
                  padding-bottom: 0px;
                }
                .flex {
                  padding-bottom: 6px;
                }
            entities: 
              - sensor.synology_temperature
            name: CPU TEMP
            align_state: center
            align_icon: right
            font_size: 100
            font_size_header: 11
            hours_to_show: 24
            line_color: var(--accent-color)
            line_width: 4
            animate: true
            points_per_hour: 2
            #lower_bound: 0
            show:
              fill: false
              graph: line
              extrema: true
              icon: true
              name: true
          - type: custom:decluttering-card
            template: divider
            variables:
              - text: INFOS
          - type: entities
            card_mod: 
              style: |
                ha-card {
                  font-family: var(--primary-font-family);
                  --my-font01-color: {% if states('sensor.synology_volume_1_volume_used')|int < 70 %} green {% else %} orangered {% endif %};
                  --my-font02-color: {% if states('sensor.synology_volume_1_average_disk_temp')|int < 50 %} green {% else %} orangered {% endif %};
                  --my-font03-color: {% if states('sensor.synology_volume_1_status')== 'normal' %} green {% else %} red {% endif %}
                } 
                .card-content {
                  padding-top: 0px;
                  padding-bottom: 0px;
                }              
            entities:
              - type: custom:fold-entity-row
                head: 
                  entity: sensor.synology_volume_1_status
                  name: Volume
                  type: 'custom:multiple-entity-row'        
                  show_state: false
                  entities:
                    - entity: sensor.synology_volume_1_volume_used
                      name: Utilisé
                      format: 'precision2'
                      styles:
                        color: var(--my-font01-color)
                    - entity: sensor.synology_volume_1_average_disk_temp 
                      name: Température
                      format: 'precision2'
                      styles:
                        color: var(--my-font02-color)
                    - entity: sensor.synology_volume_1_status
                      name: Etat
                      format: 'precision2'
                      styles:
                        color: var(--my-font03-color)
                group_config:
                secondary_info: last-changed
                padding: 5 
                entities:
                  - entity: sensor.synology_drive_1_status
                    type: custom:multiple-entity-row
                    entities:    
                    - entity: sensor.synology_drive_1_temperature
                      name: false
                  - entity: sensor.synology_drive_2_status
                    type: custom:multiple-entity-row
                    entities:    
                    - entity: sensor.synology_drive_2_temperature
                      name: false
                  - entity: sensor.synology_drive_3_status
                    type: custom:multiple-entity-row
                    entities:    
                    - entity: sensor.synology_drive_3_temperature
                      name: false
                  - entity: sensor.synology_drive_4_status
                    type: custom:multiple-entity-row
                    entities:    
                    - entity: sensor.synology_drive_4_temperature
                      name: false 
             #- sensor.cpu_speed  
              - sensor.synology_network_up
              - sensor.synology_network_down 
          - type: custom:decluttering-card
            template: divider
            variables:
              - text: SYSTEME
          - type: horizontal-stack
            cards: 
              - type: horizontal-stack
                cards:                   
                  - type: 'custom:mini-graph-card'
                    card_mod: 
                      style: |
                        ha-card {
                          font-family: var(--primary-font-family);
                        }
                        .graph {
                          padding-top: 0px;
                          padding-bottom: 0px;
                        }
                        .info {
                          padding-bottom: 0px;
                        }
                        .flex {
                          padding-bottom: 10px;
                        }

                    entities: 
                      - sensor.synology_cpu_utilization_total
                    name: CPU LOAD
                    align_state: center
                    align_icon: right
                    font_size: 100
                    font_size_header: 11
                    hours_to_show: 24
                    line_color: var(--accent-color)
                    line_width: 4
                    animate: true
                    points_per_hour: 2
                    #lower_bound: 0
                    show:
                      fill: false
                      graph: line
                      extrema: true
                      icon: true
                      name: true

              - type: 'custom:mini-graph-card'
                card_mod: 
                  style: |
                    ha-card {
                      font-family: var(--primary-font-family);
                    }
                    .graph {
                      padding-top: 0px;
                      padding-bottom: 0px;
                    }
                    .info {
                      padding-bottom: 0px;
                    }
                    .flex {
                      padding-bottom: 10px;
                    }
                entities: 
                  - sensor.synology_memory_usage_real
                name: Memoire
                align_state: center
                align_icon: right
                font_size: 100
                font_size_header: 11
                hours_to_show: 24
                line_color: var(--accent-color)
                line_width: 4
                animate: true
                points_per_hour: 2
                #lower_bound: 0
                show:
                  fill: false
                  graph: line
                  extrema: true
                  icon: true
                  name: true
3 « J'aime »

Merci :+1:, je vais essayer de l’adapter à mes besoins (c’est pas gagné :grin:)

Salut felix62,

J’aime bien ta carte imprimante

Pourrais -tu partager le code ?

Merci à toi

Oui bien sur :slight_smile: @foxbru

code button-card template.yaml :

####################################################################################################################################################################################################################################################################################################################################################
####    ENCRE IMPRIMANTE
###############################################################################################################################################################
  inkwell:
    show_name: false
    show_state: true
    extra_styles: |
      [[[ return `
        @keyframes pulse {
          5% {
            background-color: ${variables.color};
          }
        }
      `]]]
    styles:
      icon:
        - opacity: 0.7
        - color: '[[[ return variables.color ]]]'
        - filter: drop-shadow( 0 0 2px rgba(0, 0, 0, .7))
      state:
        - font-size: 1.5em
        - font-weight: bold
        - text-shadow: 0 0 6px black
        - overflow: visible
      card:
        - border: solid 3px gray
        - border-top: none
        - background: |
            [[[
              var level = entity.state;
              var color = variables.color;
              return `linear-gradient(to top, ${color}, ${color} ${level}%, rgba(255,255,255,0.12) ${level}%)`
            ]]]
        - animation: |
            [[[
              return (0 + entity.state) < 10
                ? 'pulse ease-in-out 1s infinite'
                : 'none'
            ]]]

Code lovelace card:

#################################################################################################################################################
####    Imprimante et niveau encre                                                                                                              #
#################################################################################################################################################        
      - type: "custom:button-card"
        entity: sensor.cnmf642c_643c_644c
        name: MF643
        color: gray
        show_state: true
        styles:
          card:
            - padding: 0 0 5px 0
          icon:
            - width: 100%
          state:
            - text-align: left
            - width: 100%
          grid:
            - grid-template-areas: '"i c m y k" "n s s s s"'
            - grid-template-columns: 1fr 1fr 1fr 1fr 1fr
            - grid-template-rows: auto 1em
          custom_fields:
            k:
              - width: 80%
              - margin: auto
            c:
              - width: 80%
              - margin: auto
            m:
              - width: 80%
              - margin: auto
            "y":
              - width: 80%
              - margin: auto
        custom_fields:
          k:
            card:
              type: "custom:button-card"
              template: inkwell
              entity: sensor.cnmf642c_643c_644c_canon_cartridge_054_black_toner
              variables:
                color: black
          c:
            card:
              type: "custom:button-card"
              template: inkwell
              entity: sensor.cnmf642c_643c_644c_canon_cartridge_054_cyan_toner
              variables:
                color: cyan
          m:
            card:
              type: "custom:button-card"
              template: inkwell
              entity: sensor.cnmf642c_643c_644c_canon_cartridge_054_magenta_to
              variables:
                color: magenta
          "y":
            card:
              type: "custom:button-card"
              template: inkwell
              entity: sensor.cnmf642c_643c_644c_canon_cartridge_054_yellow_ton
              variables:
                color: yellow

je lis enfin un utilisateur, merci

C’est moi qui te remercie @papoo pour ce code très utile :slightly_smiling_face:

Merci

Question de débutant :sweat: : ce code button-card template.yaml tu le mets où ?

Cordialement

Désolé pour l’attente @foxbru , je débute aussi :slight_smile:

Pour infos: tu peux décomposer ton fichier ui-lovelace.yaml pour éviter d’avoir des Km et des Km de code et lorsqu’il y a une erreur tu gagnes du temps également.

pour te répondre dans mon ui-lovelace.yaml cela se présente:

title: Maison

decluttering_templates:
  !include www/custom-lovelace/decluttering_templates.yaml

button_card_templates:
  !include www/custom-lovelace/button_card_templates.yaml

views: 
  - !include www/lovelace/00_home_view.yaml
  - !include www/lovelace/01_meteo.yaml
  - !include www/lovelace/02_camera.yaml
  - !include www/lovelace/03_informatique.yaml
  - !include www/lovelace/04_settings.yaml
  - !include www/lovelace/05_projets.yaml

le button template pointe dit alors que tout mes button template sont dans :
www → custom-lovelace → button_card_templates.yaml

dans lequel tu vas pouvoir coller le template [encre imprimante] :

####################################################################################################################################################################################################################################################################################################################################################
####    ENCRE IMPRIMANTE
###############################################################################################################################################################
  inkwell:
    show_name: false
    show_state: true
    extra_styles: |
      [[[ return `
        @keyframes pulse {
          5% {
            background-color: ${variables.color};
          }
        }
      `]]]
    styles:
      icon:
        - opacity: 0.7
        - color: '[[[ return variables.color ]]]'
        - filter: drop-shadow( 0 0 2px rgba(0, 0, 0, .7))
      state:
        - font-size: 1.5em
        - font-weight: bold
        - text-shadow: 0 0 6px black
        - overflow: visible
      card:
        - border: solid 3px gray
        - border-top: none
        - background: |
            [[[
              var level = entity.state;
              var color = variables.color;
              return `linear-gradient(to top, ${color}, ${color} ${level}%, rgba(255,255,255,0.12) ${level}%)`
            ]]]
        - animation: |
            [[[
              return (0 + entity.state) < 10
                ? 'pulse ease-in-out 1s infinite'
                : 'none'
            ]]]

N’hésite pas si j’ai manqué de précision :slight_smile:

Super boulot…
je peux te demander les code pour la carte avec tes ampoule ? c’est superbe.
aussi bien pour l’icone, que le reste. si je peux me permettre bien sur. c’est gentil a toi.

Le code des ampoule vient de paradis artificiels mais je pourrais te la partager avec plaisir lorsque je rentrerai de voyage :slightly_smiling_face::+1:

ok, c’est gentil. merci a toi.
ne m’oublie pas…

Voila @Schumi

Il te faudra certainement mettre les mains dans le cambouis :stuck_out_tongue:

Lovelace

####################################################################################################################################################################################################################################################################################################################################################
####    LIGHTS
####################################################################################################################################################################################################################################################################################################################################################
      - type: horizontal-stack   
        cards:
          - type: custom:decluttering-card
            template: light
            variables:
              - name: Salon
              - entity: group.all_lights_salon
              - sensor: sensor.all_lights_salon
              - hold_action: !include popup_card/light_salon.yaml
              - double_tap_action: !include popup_card/light_salon.yaml
          - type: custom:decluttering-card
            template: light
            variables:
              - name: Salle a manger
              - entity: group.all_lights_salle_a_manger
              - sensor: sensor.all_lights_salle_a_manger
              - hold_action: !include popup_card/light_salle_a_manger.yaml
              - double_tap_action: !include popup_card/light_salle_a_manger.yaml
#          - type: custom:decluttering-card
#            template: light
#            variables:
#              - name: Entrée
#              - entity: group.all_lights_entree
#              - sensor: sensor.all_lights_entree
#              - double_tap_action: !include popup_card/light_entree.yaml
#          - type: custom:decluttering-card
#            template: light
#            variables:
#              - name: Cuisine
#              - entity: group.all_lights_cuisine
#              - sensor: sensor.all_lights_cuisine
#              - double_tap_action: !include popup_card/light_cuisine.yaml
#          - type: custom:decluttering-card
#            template: light
#            variables:
#              - name: Salle de bain
#              - entity: group.all_lights_sdb
#              - sensor: sensor.all_lights_sdb
#              - double_tap_action: !include popup_card/light_sdb.yaml
          - type: custom:decluttering-card
            template: light
            variables:
              - name: Chambre
              - entity: group.all_lights_chambre
              - sensor: sensor.all_lights_chambre
              - hold_action: !include popup_card/light_chambre.yaml
              - double_tap_action: !include popup_card/light_chambre.yaml
          - type: custom:decluttering-card
            template: light
            variables:
              - name: HueGo
              - entity: group.all_lights_huego
              - sensor: sensor.all_lights_huego
              - hold_action: !include popup_card/light_huego.yaml
              - double_tap_action: !include popup_card/light_huego.yaml

Comme tu as pu le remarquer il fait appelle à des groupes et au decluttering.
decluttering:

####################################################################################################################################################################################################################################################################################################################################################
####    LIGHT
####################################################################################################################################################################################################################################################################################################################################################
light:
  card:
    type: custom:button-card
    entity: "[[entity]]"
    icon: mdi:lightbulb
    show_icon: false
    aspect_ratio: 1/1
    name: "[[name]]"
    card_mod:
      style: |
        ha-card {
          box-shadow: 
            {% if is_state('sun.sun', 'above_horizon') and is_state('[[entity]]', 'on') %}
              inset -4px -4px 8px 0 rgba(255,255,255,.5), inset 4px 4px 8px 0 rgba(0,0,0,.03);
            {% elif is_state('sun.sun', 'above_horizon') and is_state('[[entity]]', 'off') %}                      
              -5px -5px 8px 0 rgba(255,255,255,.5),5px 5px 8px 0 rgba(0,0,0,.03);
            {% elif is_state('sun.sun', 'below_horizon') and is_state('[[entity]]', 'on') %}                      
              inset -4px -4px 10px 0 rgba(50, 50, 50,.5), inset 4px 4px 12px 0 rgba(0,0,0,.3); 
            {% elif is_state('sun.sun', 'below_horizon') and is_state('[[entity]]', 'off') %}   
              -5px -5px 8px 0 rgba(50, 50, 50,.5),5px 5px 8px 0 rgba(0,0,0,.15);
            {% endif %} 
        }
    custom_fields:
      notification: >
        [[[ return Math.floor(states['[[sensor]]'].state) ]]]
      icon_hue: &icon_hue >
        [[[ const state = entity.state === 'on' ? 'animate' : null;
        return `<svg viewBox="0 0 50 50"><style>@keyframes animate{0%{transform: scale(0.85);}20%{transform: scale(1.1);}40%{transform: scale(0.95);}60%{transform: scale(1.03);}80%{transform: scale(0.97);}100%{transform: scale(1);}}.animate{animation: animate 0.8s; transform-origin: center;}</style>
        <path fill="#9da0a2" d="M27.4 47.3h-4.9s-.7.1-.7.8.4.9.7.9h4.9c.3 0 .7-.1.7-.9s-.7-.8-.7-.8zm3.3-2.9H19.3s-.8 0-.8.8.6.9.8.9h11.5c.2 0 .8-.1.8-.9-.1-.8-.9-.8-.9-.8zm0-3H19.3s-.8 0-.8.8.6.9.8.9h11.5c.2 0 .8-.1.8-.9-.1-.8-.9-.8-.9-.8zm0-2.9H19.3s-.8 0-.8.8.6.9.8.9h11.5c.2 0 .8-.1.8-.9s-.9-.8-.9-.8zm5.2-23.2c-3.3-5.3-7-5.6-10.9-5.6-3.8 0-8.4.4-10.9 5.6-.1.1-.1.3.1.7.4.8 3.3 7.2 3.2 18.8 0 1.1-.1 1.6 0 1.7 0 .1 0 .7 1.1.7h13c1 0 1-.5 1.1-.7v-1.7c-.1-11.6 2.8-18 3.2-18.8.1-.4.1-.5.1-.7"/>
        <path class="${state}" fill="var(--button-card-light-color-no-temperature)" d="M14.1 15.3c3.4-.3 7-.4 10.9-.4 3.8 0 7.5.2 10.9.4.4-.4.7-.8.9-1.1C39 8.5 38.9 6.5 38.9 6c-.2-4.4-8.4-5-12.1-5h0-3.4c-3.7 0-12 .5-12.1 5 0 .5-.1 2.5 2.1 8.2 0 .3.3.8.7 1.1z"/></svg>`; ]]]
    template: light
    styles: &icon_hue_styles
      custom_fields:
        icon_hue:
          [top: 20%, left: 27%, width: 45%, height: 45%, position: absolute]
        notification:
          - background-color: >
              [[[
                if (states['[[sensor]]'].state == 0)
                return "lime";
                return "red";
              ]]]
          - border-radius: 50%
          - position: absolute
          - left: 70%
          - top: 5%
          - height: 20px
          - width: 20px
          - font-size: 15px
          - line-height: 20px
      name:
        - font-size: 13px
        - color: var(--text-color)
        - position: absolute
        - top: 75%
        - padding-bottom: -20px
      card:
        - background-color: var(--primary-background-color)
        - border-radius: 20px
      grid:
        - position: absolute
    state:
      - value: "on"
        styles:
          card:
            - box-shadow: none
          icon:
            - color: "yellow"
        id: on-icon
      - value: "off"
        styles:
          card:
            - box-shadow: none
        id: off-icon
    tap_action:
      action: toggle
    hold_action:
      action: more-info
    double_tap_action: "[[double_tap_action]]"

Dans le dossier lovelace > popupcard:
light.salon.yaml (c’est un exemple à multiplier en fonction de tes lampes et groupes de lampes)

              action: fire-dom-event
              browser_mod:
                command: popup
                deviceID:
                  - this
                  - dashboard  
                title: Salon 
                style:
                  $: |
                    .mdc-dialog .mdc-dialog__container .mdc-dialog__surface {
                      box-shadow:none;
                    }
                  .: |
                    :host {
                      --mdc-theme-surface: rgba(0,0,0,0);
                      --secondary-background-color: rgba(0,0,0,0);
                      --ha-card-background: rgba(0,0,0,0);
                      --ha-card-box-shadow: none;                      
                      --mdc-dialog-scrim-color: rgba(0,0,0,0.8);
                      --mdc-dialog-min-height: 87%;
                      --mdc-dialog-min-width: 100%;
                      --mdc-dialog-max-width: 100%;
                    }
                    mwc-icon-button {
                      color: #FFF;
                    }                                       
                card:
                  type: custom:light-popup-card               
                  entity: light.salon
                  icon: mdi:wall-sconce-flat
                  actionsInARow: 8
                  brightnessWidth: 150px
                  brightnessHeight: 280px
                  switchWidth: 150px
                  switchHeight: 280px   
                  actions:
                    - service: scene.turn_on
                      service_data:
                        entity_id: scene.salon_relax
                      color: "#FDCA64"
                      icon: mdi:camera-iris
                      name: relax
                    - service: scene.turn_on
                      service_data:
                        entity_id: scene.salon_reading
                      color: "#FFE7C0"
                      icon: mdi:camera-iris
                      name: reading
                    - service: scene.turn_on
                      service_data:
                        entity_id: scene.salon_concentrate
                      color: "#BBEEF3"
                      icon: mdi:camera-iris
                      name: concentrate
                    - service: scene.turn_on
                      service_data:
                        entity_id: scene.salon_energize
                      color: "#8BCBDD"
                      icon: mdi:camera-iris
                      name: energize                               
                  settings:
                    openButton: Réglages
                    closeButton: Fermer
                  settingsPosition: bottom
                  displayType: slider
                  fullscreen: false
                  sliderTrackColor: grey  #couleur du fond de la gauge exemple: "#727272"
                  settingsCard:
                    type: entities
                    cardOptions:
                      entities: 
                        - type: divider                            
                        - type: custom:slider-entity-row
                          entity: light.salon
                          toggle: true 
                        - type: divider                            
                        - type: custom:slider-entity-row
                          entity: light.spot_1
                          toggle: true 
                        - type: custom:decluttering-card
                          template: rgb-light-card #template color card
                          variables:
                            - entity: light.spot_1                          
                        - type: divider                                                           
                        - type: custom:slider-entity-row
                          entity: light.spot_2
                          toggle: true
                        - type: custom:decluttering-card
                          template: rgb-light-card
                          variables:
                            - entity: light.spot_2                          
                        - type: divider 
                        - type: custom:slider-entity-row
                          entity: light.spot_3
                          toggle: true
                        - type: custom:decluttering-card
                          template: rgb-light-card
                          variables:
                            - entity: light.spot_3                          
                        - type: divider  
                        - type: custom:slider-entity-row
                          entity: light.spot_4
                          toggle: true
                        - type: custom:decluttering-card
                          template: rgb-light-card
                          variables:
                            - entity: light.spot_4                          
                        - type: divider                       
                    cardStyle: |
                      background-color:#FFF;        


grand merci a toi. je vais jetter un coup d’oeil la dessus.

Du coup, obliger de le faire en yaml ??
pas possible par le graphic ?

Tout est possible par graphique, mais il n’y aura pas autant d’optimisation de code…:innocent:

oui, mais alors le decluttering et le template, je dois les mettre dans le dashboard-row tout les deux ??

L’éditeur de configuration :

ok, je vais tester. merci a toi :wink:

pour la blague du jour, cela ne fonctionne plus chez moi… Pareil chez toi ?

Capture d’écran 2021-08-30 à 14.32.08

pourtant le lien est toujours correcte.
quelque chose a modifier sur la carte ou dans le scrape ?