Obtenir le temps d'utilisation d'un appareil électrique sur une période donnée

Merci de t’intéressé à ce problème.
Mon fichier configuration.yaml
et donc le sensor copie adaptée à l’exemple de base.

homeassistant:
# KNX IP Interface ABB IP Router IPR/S
  packages: !include_dir_named knxfiles

# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

# Text to speech
tts:
  - platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
camera: !include cameras.yaml
template: !include templates.yaml

####################
# TIME SENSOR
####################
sensor:
- platform: time_date
  display_options:
     - 'time'
     - 'date'

########################### 
# HISTORY SENSOR
########################### 

- platform: history_stats
  name: marche_today
  entity_id: binary_sensor.circulateur_sol
  state: 'on'
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"
  
- platform: history_stats
  name: marche_hier
  entity_id: binary_sensor.circulateur_sol
  state: 'on'
  type: time
  end: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  duration:
  hours: 24
    
- platform: history_stats
  name: marche_semaine
  entity_id: binary_sensor.circulateur_sol
  state: 'on'
  type: time
  start: "{{ as_timestamp( now().replace(hour=0, minute=0, second=0, microsecond=0) ) - now().weekday() * 86400 }}"
  end: "{{ now() }}"
  
- platform: history_stats
  name: marche_mois
  entity_id: binary_sensor.circulateur_sol
  state: 'on'
  type: time
  start: "{{ now().replace(day=1, hour=0, minute=0, second=0, microsecond=0 ) }}"
  end: "{{ now() }}"
 
# EOF    
    
    

alors je parlais plus de la configuration pour faire les deux automatisations (input_boolean, utility meter ect…)
comment as tu écris les deux automatisations en yaml ou UI comme tu veux au niveau des notifications bien sur mais tant qu’à faire sur les 2 automatisations au complet

il semble que, quelque-part dans ta configuration, tu essaye de faire un offset sur un sensor.history_stats mais ce offset est vide

Pour moi, a 1er vue, ça n’a rien a avoir avec ce topic mais c’est vrai que de trouver d’où vient ce souci peut être pénible

1 « J'aime »

Bonjour,
je vais revenir au début du post, je suis dans la création du compteur pour ma TV.
Merci @syl2042 pour les exemples ! Ça commence à prendre forme chez moi.

Mais je ne comprends pas pourquoi passer par un Template. Est-ce que le sensor ne suffit pas ?
Pouvez-vous m’expliquer la formule :

  value_template: "{% set hours = states('sensor.temps_allumage_pm_today') | float %} 
  {% set minutes = ((hours % 1) * 60) | int %}
  {{ '%02ih %02im'%(hours // 1, minutes) }}"

Je ne suis pas à l’aise avec ces codes, c’est quoi d’ailleurs…python ?
Comment on peut apprendre ça et savoir jouer avec ?

D’autant que j’ai beau le réécrire sans cesse le Template n’a pas l’air de fonctionner:

Invalid config for [template]: [Temps_TV_Auj_templ] is an invalid option for [template]. Check: template->sensor->0->Temps_TV_Auj_templ. (See /config/templates.yaml, line 18).

Ou alors j’ai un pb d’indentation, comme à chaque fois. Je ne m’en sors jamais avec ça…
j’ai un renvoi vers Templates.yaml dans mon fichier de config., donc voici mon fichier Template
(est ce que ça peut etre perturber par mon 1er « - sensors » ?

#Carte Date & Heure
- sensors:
   week_day:   
    value_template: "{{ now().strftime('%A')}}"

   current_date:
     value_template: "{{ now().strftime('%d')}} {{ now().strftime('%B')}} {{ now().strftime('%Y')}}" 

   time_fr:
     value_template: "{{ now().strftime('%H:%M')}}"

   jour_fr:
     value_template: "{{ ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'][now().weekday()] }}"

   date_fr:
     value_template: "{% 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 }}"

#Temps d'allumage TV
-  sensor:
    Temps_TV_Auj_templ:
      device_class: duration
      value_template: "{% set hours = states('sensor.Temps_TV_auj') | float %} 
      {% set minutes = ((hours % 1) * 60) | int %}
      {{ '%02ih %02im'%(hours // 1, minutes) }}"
      friendly_name: Temps TV Auj
      unique_id: "temps_TV_auj"

Bonjour,
tu mélange deux formats de template , l’ancien et du nouveau.

le template ancien format est dans sensor: ( dans configurationyaml ou sensor.yaml )
mais attention: This format still works but is no longer recommended. Use modern configuration.

# Example configuration.yaml entry
sensor:
  - platform: template
    sensors:
      solar_angle:
        friendly_name: "Sun angle"
        unit_of_measurement: "degrees"
        value_template: "{{ state_attr('sun.sun', 'elevation') }}"

      sunrise:
        value_template: "{{ state_attr('sun.sun', 'next_rising') }}"

Le template nouveau format est dans template: ( dans configurationyaml ou template.yaml )

template:
  - sensor:
      - name: "Sun State"
        state: >
          {% if is_state('sun.sun', 'above_horizon') %}
            up
          {% else %}
            down
          {% endif %}

compare les deux et tu verra les erreurs. Mais part sur le nouveau format pour être tranquille dans le futur.
regarde la doc ca aide beaucoup

Y a des incohérences dans ce template ?

template:  # nouveau format, manque un - a sensor
  sensor:  #
      temps_pm_today:     # D'ici a la fin ancien format
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_allumage_pm_today') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        friendly_name: temps_pm_today
        unique_id: "temps_pm_today"

Ca serait ca plutot:

sensor:
  - platform: template
    sensors:
      temps_pm_today: 
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_allumage_pm_today') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        friendly_name: temps_pm_today
        unique_id: "temps_pm_today"

j’ai compris il a oublier - platform: devant template au début.

J’ai cru comprendre le temps d’un instant, mais plus rien de fonctionne. C’est impressionnant cette histoire de nouveau format le bazar que ça colle. La majorité des posts, avant 2023, sont proposés selon l’ancien code :see_no_evil:

En mai j’ai déjà réécrit mes codes pour anticiper le passage à 2023.8. J’ai ouvert 2 nouveaux fichiers command_lines.yaml et templates.yaml. Évidemment que j’appelle depuis config.yaml

Maintenant je mélange « sensors » et « sensor », et - ou pas -.
Par exemple ça sa fonctionnait:

#Carte Date & Heure '(dans mon templates.yaml)
  - sensors:
     time_fr:
       value_template: "{{ now().strftime('%H:%M')}}"

ça, sa ne marche plus (value_template semble en défaut) :

  - sensors:
      - name: "time_fr"
        value_template: "{{ now().strftime('%H:%M')}}"

Et ensuite pour la partie qui m’intéressait au départ, pas mieux pourtant je me suis appliqué dans la syntaxe:

#Temps d'allumage TV
  - sensor:
      - name: "Temps TV"
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_TV_auj') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        unique_id: "temps_tv_auj"

comprend pas…

Le nouveau format c’est :

template:
  - sensor:
      - name:  
      - state: #qui remplace value_template 

Si tu as fait :

#fichier config.yaml
template: !include_dir_merge_list template/

tu as deja ecrit le template:
Donc tu fera comme ceci dans ton fichier template.yaml / ou ton dossier template

#on retire le template car il est déjà dans la config.yaml
 - sensor:
     - name:  
       state: #qui remplace value_template 
       icon: #qui remplace icon_template

En espérant que cela soit plus clair pour toi :slight_smile:

1 « J'aime »

Merci @Felix62 on progresse, car pour la 1ere fois mon capteur apparait !

ce code, donne encore une erreur

#Temps d'allumage TV
  - sensor:
      - name: "Temps TV"
        device_class: duration
      - state: "{% set hours = states('sensor.temps_TV_auj') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        unique_id: "temps_tv_auj"

Journal du Log:

Invalid config for [template]: required key not provided @ data[‹ sensor ›][0][‹ state ›]. Got None. (See /config/templates.yaml, line 31).

Vu du capteur:

Ensuite j’ai tenté une variante, qui ne génère aucune erreur dans le log. Youpi, c’est rare !

#Temps d'allumage TV
  - sensor:
      - name: "Temps TV"
        device_class: duration
        state: "{% set hours = states('sensor.temps_TV_auj') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        unique_id: "temps_tv_auj"

Malheureusement le résultat n’est pas au RdV…

Et la 1ere partie du code, basé sur autre chose, fonctionne aussi avec sa nouvelle forme, sans erreurs :sweat_smile:

#Carte Date & Heure
  - sensor:
      - name: "time_fr"
        state: "{{ now().strftime('%H:%M')}}"
      - name: "jour_fr"
        state: "{{ ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'][now().weekday()] }}"

Bonjour,
mais tu te trompe. il y a pas de - devant state, icon, unit_of_measurement … que devant name.

#on retire le template car il est déjà dans la config.yaml
 - sensor:
     - name:  
       state: #qui remplace value_template 
       icon: #qui remplace icon_template

Bonjour,
c’est le nouveau format, mais value_template: est remplacer par state: maintenant.

1 « J'aime »

Oui l’erreur vient du tirer « - » devant state a supprimer car il est déjà présent devant name.

#Temps d'allumage TV
  - sensor:
      - name: "Temps TV"
        device_class: duration
        state: "{% set hours = states('sensor.temps_TV_auj') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        unique_id: "temps_tv_auj"

PS: l’erreur de frappe est corrigé sur la réponse précédente

2 « J'aime »

Point étape et interrogation:
Le code est correct, plus aucune erreur. Les capteurs apparaissent, mais les valeurs sont soit incohérentes, soit indisponibles.

Dans le tout 1er post @syl2042 nous montre 1 Sensor (history_stat) + 1 Template.
Dans mon cas le Template ne donne aucun résultat. Retour: INDISPONIBLE.

Mon retour du Sensor history_stats, renvoi l’heure à laquelle j’allume ma télé, mais pas un cumul du temps d’utilisation…Le plus fort c’est que quand je regarde History Stats - Home Assistant, il y a une vidéo où le type créé exactement la fonction avec 1seul code celui du Sensor history_stats…seulement lui il semble obtenir une durée…Je cherche une logique mais je ne la trouve pas.

image

Quelqu’un d’autre utilise cette fonction, pourquoi History_stats ne fait pas une mesure de durée ?

Bon depuis hier, les Sensors sont fonctionnels. Sans avoir rien changé. J’ai laissé passer 24h et le cumul du temps fonctionne…à n’y rien comprendre :upside_down_face: … mais je prends.

Reste mon Template…idem je galère, même si cette fois j’ai bien progressé car je commence à comprendre ce que j’écris (grâce à Clemalex).
Par exemple, maintenant je suis sure de ma formule car validé dans le Modèle :
image

Pour éviter toutes pollutions, j’ai ramené ma formule dans le fichier de config:

# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:

# Text to speech
tts:
  - platform: google_translate

group: !include groups.yaml
automation: !include automations.yaml
command_line: !include command_lines.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
sensor: !include sensors.yaml
#template: !include templates.yaml
utility_meter: !include utility_meter.yaml

template:
  - sensor:
      - name: "Temps TV"
        device_class: duration
        state: "{% set hours = states('sensor.temps_TV_ON_auj') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih%02im'%(hours // 1, minutes) }}"
        unique_id: "temps_tv_auj"

Malgré toutes ces précautions, aucun retour de ce capteur.
Est-ce qu’un autre réglage (recorder, etc… ?) peut perturber ça ?

image

Bonjour @roumano et a ceux qui liront mon post.

Merci pour ton code, que j’utilise depuis peu.

Je tente aujourd’hui de faire la notification dans un fichier csv, mais sa ne fonctionne pas.

J’ai ajouté ce code dans mon fichier notify.yaml (packages) :

notify:
##Notify Lave vaisselle fichier CSV
  - name: lave_vaisselle
    platform: file
    filename: /local/data/git/cycle/lave_vaisselle.csv 

J’ai ajouté ce code a la suite de mon automatisation existante :

  - service: notify.lave_vaisselle
    data:
      message: >
        {{ now().strftime("%d/%m/%Y") }} ; {{
        ((state_attr('automation.03a_lave_vaisselle_start', 'last_triggered')) |
        as_local).strftime("%Hh%M") }} ; {{ now().strftime("%Hh%M") }} ; {{
        ((now() - (state_attr('automation.03a_lave_vaisselle_start',
        'last_triggered'))).seconds / 3600 )| int }}h{{ (((now() -
        (state_attr('automation.03a_lave_vaisselle_start',
        'last_triggered'))).seconds % 3600 )/60 )| round }}m ; {{
        states('sensor.lave_vaisselle_power_cycle') }}Wh ; {{
        (states('sensor.lave_vaisselle_power_cycle') | float(default=0) *
        (states('sensor.edf_tempo_prix_actuel')| float(default=0)) /10) |
        round(3) }}€ ;        

J’ai ajouter un dossier /data/git/cycle dans mon dossier www de HA avec dedans un fichier lave_vaisselle.csv

Mon souci c’est que rien ne s’écrit dans ce fichier. il reste vide…

Merci de votre aide

PS: J’ai une autre question, mais on verra par la suite.

J’avais aussi galérer, un peut, avec ça à l’époque.

Pour moi, il faut passer en PATH complet pour y arriver.
Dans mon exemple, j’écrit sur /data/git/cycle/lave_vaisselle.csv alors que mon HA est installer sur /data/homeassistant/.homeassistant

Il faut aussi, bien sur, faire attention aux droits unix du répertoire et du dédit fichier pour que home assistant puisse y écrire

Merci pour ta réponse

J’ai finalement retirer le chemin, et laisser que le nom du fichier, celui ci apparait bien.
Mais j’ai un bug pour le cout " 0.0€ ". Je vais voir lors d’un cycle réel.

Home Assistant notifications (Log started: 2023-08-27T16:44:28.979458+00:00)					
--------------------------------------------------------------------------------					
27/08/2023	 22h22 	 18h44 	 20h22m 	 0Wh 	 0.0€ 

J’ai un autre souci, quand je redémarre HA, je reçois de nouveau les notifications, as tu constaté ce problème ?

le " 0.0€ " n’est pas un bug a proprement parler, mais un soucis de format. Si tu importes le fichier CSV sur Excel, en fonction du format d’importation choisi tu verras ce code s’afficher comme € (je ne sais plus de mémoire quel format il faut sélectionner à l’import, mais je sais que ce n’est pas le format proposé par défaut.

1 « J'aime »