Calcul de durée - Ecran

Bonjour,
comme vous le voyez j’ouvre pas mal de poste désolé, sur ma migration.
J’ai décidé de me pencher plus sérieusement sur ma bascule Jeedom vers HA.

J’essaie d’identifier les scénarios pour moi les plus importants et lesquels j’ai le plus de mal à basculer en HA.

Un des plus importants, est un scénario global qui calcul le temps d’écran des enfants.
Que se soit sur leur PC, mais aussi sur les TV, Xbox etc …
Sous Jeedom j’avais un scénario global par équipement :

  • Qui comptabilisait la durée d’écran dès le démarage de l’équipement ( dépendant de l’équipement, ca pouvait etre du ping, mais aussi suivant la conso d’un wall plus pour le pc …)
  • Qui annoncait via la Google Home à 35 min « Attention il faut stopper l’équipement dans 10 minutes »
  • Qui annoncait au bout de 45 min « Attention l’éqiuipement est allumé depuis $temps_ecran »
  • Qui annoncait toutes les 2 min après 45 minutes « Attention l’éqiuipement est allumé depuis $temps_ecran »

Déjà ca sous HA … dur dur

Et la cerise sur le gâteau, c’est créer un dashboard dédié au temps d’écran

Pourriez vous m’aider SVP à reproduire cela à la sauce HA ?
Je n’avais aucune ligne de code dans Jeedom
J’aimerai n’avoir aucune ligne de code dans HA , pas de .yml

Salut

Tu vas sans aucun doute avoir un dilemme. Utiliser du code (yaml ) ou utiliser uniquement ce qui est dispo sans code (ça veut en premier lieu dire que visuellement) ça ne sera pas comme Jeedom. Après visuellement jeedom c’est pas une référence, là par exemple il y a des soucis de tailles/alignements. Et parfois aussi HA utilise les templates en jinja :sweat_smile:

Et ça commence presque maintenant, tu as de la chance, c’est du jinja, pas du yaml :wink:
Pour le temps de calcul :
Paramètres => Appareils et service => Entrées.
Tu crées et tu cherches « History stats »


Tu donnes un nom, l’entité que tu veux « compter », tu laisses le compte en « temps »

Tu indiques le ou les etats à compter

Pour compter sur la période du jour en cours, tu compte à partir de minuit

{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}

jusqu’à maintenant

{{ now() }}

A refaire pour tout ce que tu veux compter et en ayant activé les statistiques via le recorder

Pour la partie visuelle… Libre à toi de voir ce que tu veux, faire et quoi utiliser… La carte de base « Entities » par exemple

Petit conseil malgré tout et pas que pour le code, les automatisations et l’affichage :
Poses-toi le question de ce que tu veux obtenir fonctionnellement… Evite de vouloir faire « comme » jeedom, il y a boire et à manger dans les fonctionnements que tu connais déjà. HA est beaucoup mieux structuré et permet de faire mieux, en moins (certes avec un peu de code) compliqué. Donc repartir des bases propres est salutaire dans le cas d’une migration

2 « J'aime »

super merci !
Je regare ça.
Je sais que je dois tout réimaginer différement, mais 10 ans de Jeedom c’est dur à lacher
Je trouvais vraiment les scénarios géniaux !
Pour la durée de record, je voudrais que ca compte à partir de l’allumage de l’équipement et se remettent à zero à l’extinction (c’est une durée de visionnage d’écran :slight_smile: )

Tu es certain ?
Si ça se remet à 0 à l’extinction, comment tu visualises/retrouves ton 1min…
De plus, tu allumes 20 fois un truc pendant 20 minutes dans la journée, ça produit quoi ?

A mon avis, ton besoin nécessite d’être plus explicite

Oui, et c’est effectivement encore plus important avec un tel passif.

Tu es encore nouveau, mais les scenarios HA sont largement plus puissants. Avec les nouvelles interfaces on utilise de moins en moins de yaml, dans la prise en mains par les débutants est plus rapide, mais yaml ça reste une option qui va bien au delà des blocs de codes PHP de jeedom

Merci vraiment pour ton aide.
Pour mon besoin, je suis pas clair.

Imaginons à 14h00 session écran des enfants
ils allument la TV à 14h00
→ Le compteur s’enclenche
→ Au bout de 35 minutes de visionnage ca prévient qu’il reste 10 min d’écran
→ Au bout de 45 minutes de visionnage ca dit qu’il est temps d’éteindre et ca dit le temps d’écran
→ toute les 5 minutes tant que c’est pas éteint ca dit le temps d’écran.
→ ils éteignent la TV le timer s’arrete et se remet à 0

Par contre ce timer ne s’enclenche que entre 10h et 17h ; car le soir les parents ont le droit sans que la domotique leur rappel :s

En mode jeedom ca donne ça :slight_smile:
je pleure, car avec Jeedom je faisait ca en 2 minutes :slight_smile:

Ils éteignent, ils rallument, et c’est reparti, ils coupent la Google Home aussi j’imagine :wink:
Enfin c’est ce que je ferai :rofl:
Je resors :slight_smile:
Bob

1 « J'aime »

Pour moi c’est pas efficace, il suffit de couper et ça repart…Mais bon

Une trame vite faite, il faut relire/adapter. D’ailleurs le partage de scénario avec jeedom, c’était pas top, là avec un bout de yaml tu peux l’importer et le lire directement

Cette automatisation se déclenche exactement après 35 minutes de TV allumée (dans la bonne fenêtre horaire).

alias: '[Temps Écran] 1. Avertissement 10 Minutes Restantes (35 min)'
description: Préviens après 35 minutes de visionnage.
trigger:
  - platform: state
    entity_id: binary_sensor.tv_on
    to: 'on'
    # Se déclenche après 35 minutes de ON
    for:
      minutes: 35
condition:
  - condition: time
    # Uniquement entre 10h et 17h
    after: '10:00:00'
    before: '17:00:00'
action:
  - service: tts.cloud_say
    data:
      entity_id: media_player.votre_enceinte
      message: "Attention, il ne reste plus que 10 minutes d'écran !"
mode: single

Donc la version 45min est quasi identique, elle pourrait lancer en plus un timer de 5 min

alias: '[Temps Écran] 2. Avertissement 45 Minutes et Démarrage du Rappel'
description: Préviens après 45 minutes de visionnage et lance le timer de rappel.
trigger:
  - platform: state
    entity_id: binary_sensor.tv_on
    to: 'on'
    # Se déclenche après 45 minutes de ON
    for:
      minutes: 45
condition:
  - condition: time
    # Uniquement entre 10h et 17h
    after: '10:00:00'
    before: '17:00:00'
action:
  # Action 1 : Alerte sonore de fin de temps
  - service: tts.cloud_say
    data:
      entity_id: media_player.votre_enceinte #
      message: "Attention, temps d'écran écoulé !"
  # Action 2 : Démarrer le timer de 5 minutes
  - service: timer.start
    target:
      entity_id: timer.temps_rappel
mode: single

Et le rappel toutes les 5min (il faut un timer à créer dans les entrées)

alias: '[Temps Écran] 3. Rappel Répété (Boucle de 5 minutes)'
description: Se déclenche toutes les 5 minutes tant que la TV est allumée.
trigger:
  - platform: event
    event_type: timer.finished
    event_data:
      entity_id: timer.temps_rappel # Déclenché lorsque le timer se termine
condition:
  - condition: state
    entity_id: binary_sensor.tv_on
    state: 'on' # La TV doit toujours être allumée
action:
  # Action 1 : Alerte sonore avec le temps écoulé
  - service: tts.cloud_say
    data:
      entity_id: media_player.votre_enceinte
      message: "Attention, rappel, le temps d'écran écoulé !"
  # Action 2 : Relancer le timer pour la prochaine itération
  - service: timer.start
    target:
      entity_id: timer.temps_rappel
mode: single

Plein d’axes ou d’optimisations (fusionner en une seule automatisation, factoriser les rappels etc) mais bon c’est pas le sujet pour l’instant.

Bref, évidement c’est pas inné, et vu que tu commences aussi à faire la migration Zwave attention à ne pas vouloir griller toutes les étapes de réapprentissage, plein de sujets à la fois, c’est forcément moins facile ! Lecture de la doc, recherche dans le forum, questions etc sont à exploiter

1 « J'aime »

Merci
Je vais tester tout ça
Si c’était tres efficace
Car jeedom utilisait le state duration sur les 60 dernières minutes !
Donc au final même si ils etaignaient, le state duration était toujours là

Ça m’ennuie de passer par du yaml
Je sais même pas encore faire … J’ai.lu qu’il fallait mettre ça dans le fichier de conf global

Je pensais vraiment pouvoir faire ça tout en graphique

Il te manque les bases là … Evidement que tu peux importer ce yaml dans l’interface graphique… C’est fini de taper en dur dans le fichier pour les automatisations :
Création d’une nouvelle automatisation depuis l’ui, bascule en yaml (en haut à droite), copié/collé, rebascule en ui

Tu vois l’importance de repartir de la base, en 3 messages le besoin n’est plus le même …

1 « J'aime »

On devrait pouvoir le faire sans passer par la moindre ligne de YAML.

Sur la 2ème automatisation, il y a un souci d’indentation du code. Et en “best practice” c’est d’utiliser “action“ que “service”.

Depuis les dernières versions, et les futures qui vont arriver, il est même possible directement de “coller” du code YAML dans l’interface sans passer par le mode éditeur YAML, il reconnait alors le code et importe automatiquement (trigger, condition, et action), c’est pas complètement abouti mais ça tend à l’être.

1 « J'aime »

Salut
Bien vu. Comme indiqué, le code est vite faite, à relire et adapter.
L’ui se chargera de convertir avec les best practices au moment de l’enregistrement.

Edit:
Donc j’ai réaligné les indentations des automatisations
Pour faire ‹ à la jeedom ›, il suffit de reprendre la valeur du temps calculé dans les premiers echanges et de l’exploiter comme trigger

triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.temps_de_chauffe
    above: 0.5833

La valeur s’exprime en heures, donc 0.5833 c’est env 35min

Et dans ce cas la limite est 45 min pour toute la journée, pas juste dans l’heure

1 « J'aime »

Bonjour à tous.
Déjà merci pour votre aide au quotidien
Chaque jour j’active un scénario HA et désactive un Jeedom :slight_smile:

Pour ma durée d’écran je suis pas trop mal.

J’ai crée mes sensor de durée et ca marche pas mal.

Voiçi mon automatisation pour lancer les annonce sur ma Google Home quand on arrive à 45mn d’écran.

alias: Duree-ecran-annonce
description: ""
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.tv_chambre_duree
    below: 60
    above: 45
    id: tvch
  - trigger: numeric_state
    entity_id:
      - sensor.pc_adam_duree
    below: 60
    above: 45
    id: pcadam
  - trigger: numeric_state
    entity_id:
      - sensor.switch_duree
    below: 60
    above: 45
    id: switch
conditions:
  - condition: time
    after: "09:30:00"
    before: "20:00:00"
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
      - sat
      - sun
actions:
  - action: notify.send_message
    metadata: {}
    target:
      entity_id: notify.sms_free_antony
    data:
      message: >-
        Température extérieure {{
        states('sensor.fib_oeil_exter_air_temperature') }}°C.

        attention la TV est allumée depuis {{ states('sensor.tv_chambre_duree')
        }}minutes.
    enabled: false
  - choose:
      - conditions:
          - condition: trigger
            id:
              - tvch
        sequence:
          - action: tts.speak
            metadata: {}
            data:
              cache: true
              message: >-
                attention la TV est allumée depuis {{
                states('sensor.tv_chambre_duree') }}minutes.
              media_player_entity_id: media_player.googlehome5583
            target:
              entity_id: tts.google_translate_fr_fr
          - delay:
              hours: 0
              minutes: 0
              seconds: 5
              milliseconds: 0
          - action: tts.speak
            metadata: {}
            data:
              cache: true
              message: >-
                attention la TV est allumée depuis {{
                states('sensor.tv_chambre_duree') }}minutes.
              media_player_entity_id: media_player.googlehome2453
            target:
              entity_id: tts.google_translate_fr_fr
      - conditions:
          - condition: trigger
            id:
              - pcadam
        sequence:
          - action: tts.speak
            metadata: {}
            data:
              cache: true
              message: >-
                attention le PC de Adam est allumée depuis {{
                states('sensor.pc_adam_duree') }}minutes.
              media_player_entity_id: media_player.googlehome5583
            target:
              entity_id: tts.google_translate_fr_fr
          - delay:
              hours: 0
              minutes: 0
              seconds: 5
              milliseconds: 0
          - action: tts.speak
            metadata: {}
            data:
              cache: true
              message: >-
                attention le PC de Adam est allumée depuis {{
                states('sensor.pc_adam_duree') }}minutes.
              media_player_entity_id: media_player.googlehome2453
            target:
              entity_id: tts.google_translate_fr_fr
      - conditions:
          - condition: trigger
            id:
              - switch
        sequence:
          - action: tts.speak
            metadata: {}
            data:
              cache: true
              message: >-
                attention la switch est allumée depuis {{
                states('sensor.switch_duree') }}minutes.
              media_player_entity_id: media_player.googlehome5583
            target:
              entity_id: tts.google_translate_fr_fr
          - delay:
              hours: 0
              minutes: 0
              seconds: 5
              milliseconds: 0
          - action: tts.speak
            metadata: {}
            data:
              cache: true
              message: >-
                attention la switch est allumée depuis {{
                states('sensor.switch_duree') }}minutes.
              media_player_entity_id: media_player.googlehome2453
            target:
              entity_id: tts.google_translate_fr_fr
mode: single

J’aimerai l’améliorer en essayant de répéter le message de dépassement de durée toutes les 5 minutes après avoir dépassé 45 minutes d’écrans jusqu’a ce qu’on l’éteigne.

Je pourrais le faire avec une automatisation en + toutes les 5 minutes mais pensez vous que c’est possible dans la même automatisation ?

Essaye ça

alias: Duree-ecran-annonce
description: >-
  Annonce vocale si un écran (TV, PC, Switch) a été allumé entre 45 et 60
  minutes.
triggers:
  - entity_id: sensor.tv_chambre_duree
    id: tvch
    trigger: state
  - entity_id: sensor.pc_adam_duree
    id: pcadam
    trigger: state
  - entity_id: sensor.switch_duree
    id: switch
    trigger: state
conditions:
  - condition: time
    after: "09:30:00"
    before: "20:00:00"
  - condition: template
    value_template: |-
      {% set current_state = trigger.to_state.state | int(0) %}
          {{ current_state >= 45 and (current_state % 5) == 0 and current_state <= 60 }}
actions:
  - variables:
      name: |
        {% if trigger.id == 'tvch' %}
          la TV
        {% elif trigger.id == 'pcadam' %}
          le PC de Adam
        {% elif trigger.id == 'switch' %}
          la Switch
        {% else %}
          un appareil
        {% endif %}
      message_announcement: >-
        attention {{ name }} est allumé depuis {{ trigger.to_state.state }}
        minutes.
  - action: notify.send_message
    metadata: {}
    target:
      entity_id: notify.sms_free_antony
    data:
      message: >
        Température extérieure {{states('sensor.fib_oeil_exter_air_temperature') }}°C. {{ message_announcement }}
    enabled: true
  - data:
      cache: true
      message: "{{ message_announcement }}"
      media_player_entity_id: media_player.googlehome5583
    target:
      entity_id: tts.google_translate_fr_fr
    action: tts.speak
  - delay:
      seconds: 5
  - data:
      cache: true
      message: "{{ message_announcement }}"
      media_player_entity_id: media_player.googlehome2453
    target:
      entity_id: tts.google_translate_fr_fr
    action: tts.speak
mode: single
  • bascule des triggers sur les états (plus numériques avec bornes 45/60) et ajout d’une condition pour faire toutes les pas de 5 quand > 45min et <60min
  • utilisation des éléments du trigger pour constituer un message
  • On fusionne les messages, pour éviter de tout réécrire à chaque fois

Perso je n’ai pas compris l’idée de la température extérieure dans le SMS

1 « J'aime »

Merci Pulpy-Luke
Je vais essayer et aussi essayer de comprendre.

J’ai bien compris que le scénario allait se lancer à tous les changement d’états des durée c’est à dire toutes les minutes :slight_smile: pour les 3 capteurs
Vu que c’est un capteur de durée qui se met à jour toute les minutes j’ai l’impression
Ca risque pas de poser problème ?

J’avoue que je ne compre pas comment il va annoncer toutes les 5 minutes après 45 minutes
j"imagine que c’est ca :slight_smile:

condition: template
    value_template: |-
      {% set current_state = trigger.to_state.state | int(0) %}
          {{ current_state >= 45 and (current_state % 5) == 0 and current_state <= 60 }}

pour la partie SMS c’est un reliquat d’un test je l’ai viré

Oui, parce qu’à chaque rafraîchissement de l’un des capteurs, l’automatisation (et non un scénario) peut potentiellement se lancer. Le refresh de tes entités se fait effectivement toutes les minutes, mais ça ne veut pas dire qu’elles changent : pas d’écran = pas de variation. Au final, on n’est donc pas très loin du même comportement mais pas exactement… Voir la suite

Non, parce que les conditions font justement que la suite ne s’exécute pas. De ce point de vue, il n’y a pas de différence entre Home Assistant et Jeedom. Et déclencher quelque chose toutes les 5 minutes, indépendamment des variations de tes entités, n’est pas forcément mieux. Et en plus dans ce cas, tu n’es pas synchrone.

Oui c’est ça, ça calcule un modulo/multipe de 5, et bornes entre 45 et 60 …

Donc en gros, ça va tourne souvent quand les écrans seront allumés, mais pas le reste du temps.
Attention, il va te falloir gérer les actions en parrallèe (TV + switch par exemple), chnage

mode: single

en

mode: queued
max: 10

super merci
Je test ça en live :slight_smile: mon fiston vient d’allumer le PC :slight_smile:

J’avoue que ca me décourage un peu l’histoire du PAS …
Autant le reste je peux arriver à piger, ça je peux pas l’inventer et je ne le comprends pas.
modulo/multipe de 5, et bornes entre 45 et 60 :face_with_raised_eyebrow:

Le pas, c’est juste des maths, de la logique

  • 44 => faux, pas supérieur à 45
  • 45 => vrai et multiple de 5
  • 46 => faux, pas un multiple de 5
  • 47 => faux, pas un multiple de 5
  • 48 => faux, pas un multiple de 5
  • 49 => faux, pas un multiple de 5
  • 50 => vrai et multiple de 5

En jeedom, on aurait un truc du genre

<?php
// Exemple de variable représentant l'état (la durée en minutes)
$duree_actuelle = 55; 

// La condition vérifie :
// 1. Est-ce que la durée est supérieure ou égale à 45 ?
// 2. Est-ce que la durée est inférieure ou égale à 60 ?
// 3. Est-ce que la durée est un multiple de 5 (reste de la division par 5 est 0) ?

if (
    $duree_actuelle >= 45 && 
    $duree_actuelle <= 60 && 
    ($duree_actuelle % 5) == 0
) {
    echo "Alerte ! La durée est de $duree_actuelle minutes (entre 45 et 60, et multiple de 5).";
} else {
    echo "Pas d'alerte nécessaire à $duree_actuelle minutes.";
}

// Pour $duree_actuelle = 55, le résultat est : Alerte ! La durée est de 55 minutes...
// Pour $duree_actuelle = 65, le résultat est : Pas d'alerte nécessaire à 65 minutes.
?>

C’est plus ou moins ce que tu aurais pu mettre dans le if de ton scénario

ça se découvre (ici), ça se lit (dans la doc), ça s’apprends (tous les jours en basculant de jeedom à HA)…

En tout cas vraiment merci

au final, là pour le coup c’est plus propre que ce que je faisait sous Jeedom
J’avais 4 scénarios… (un master, et 1 pour chaque écran)

J’avais un scénario principal qui activait à l’allumage de chaque écran le scénario dédié à chaque équipement

Et le scénario par exemple pour la TV lui se lançait toutes les minutes (mais oui j’aurai put le faire à chaque changement d’état)
et ça vérifiait toutes les minutes si le dernier changement d’état, était > 45 min, il annonçait alors la durée et incrémentait une variable à +1
Tant que la variable était <1 il annoncait pas…
au final ca annoncait toutes les 2 minutes …

(round(lastStateDuration(#[CHAMBRE PARENT][TV-CHAMBRE][Statut]#,1)/60 ) > 45) ET (variable(annoncetvparents,0) <1)

Par contre j’avais un truc en plus, mais je vais essayer de l’ajouter sur mon automatisaiton HA
Ca annoncait à 35 minutes « Attention Il faut stopper la TV de la chambre dans 10 minutes »

A toi de jouer, c’est pas compliqué :

  • modifier les conditions pour laisser passer le 35 (mais pas le 40) en plus de ce qui passe déjà
  • faire un if (ou un choose) pour générer le message spécifique
  • l’envoi du SMS ou des TTS restent identiques

Tu verras au fil du temps… Jeedom est objectivement loin derrière sur plein de choses, et assez peu souvent devant

1 « J'aime »