Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save ullrik/b6b9e4af2300c34ad98437101a32e9bf to your computer and use it in GitHub Desktop.

Select an option

Save ullrik/b6b9e4af2300c34ad98437101a32e9bf to your computer and use it in GitHub Desktop.
Détection hors ligne pour les appareils Z2M avec last_seen
blueprint:
name: Détection hors ligne pour les appareils Z2M avec last_seen
description: "Tester régulièrement tous les capteurs avec 'last_seen' et 'timestamp' device_class.
(capteurs Z2M 'last_seen') pour détecter les déconnexions et, le cas échéant, exécuter une action."
domain: automation
input:
hours:
name: Delay à controler (en heures)
description: "Les capteurs qui n ont pas été détectés pendant cette période sont considérés comme hors ligne."
default: 24
selector:
number:
min: 1.0
max: 168.0
unit_of_measurement: h
mode: slider
step: 1.0
time:
name: Heure de déclenchement
description: "Heure ou le test est exécuté via la configuration"
default: '10:00:00'
selector:
time: {}
day:
name: Jour de la semaine pour tester
description: "Le test est exécuté à l heure configurée, soit tous les jours (0), soit à une date donnée
jour de semaine (1: lundi ... 7: dimanche)"
default: 0
selector:
number:
min: 0.0
max: 7.0
mode: slider
step: 1.0
exclude:
name: Capteurs exclus
description: "Capteurs 'last_seen' (provenant d appareils que vous souhaitez exclure) à exclure de la détection.
Seules les entités avec le nom 'last_seen' et 'timestamp' de device_class sont pris en charge,
sinon il faut l activer !"
default:
entity_id: []
selector:
target:
entity:
domain: sensor
actions:
name: Actions
description: "Notifications ou tâches similaires à exécuter. {{sensors}} est remplacé par
les noms des capteurs hors ligne."
selector:
action: {}
source_url: https://gist.github.com/ullrik/b6b9e4af2300c34ad98437101a32e9bf
variables:
day: !input 'day'
hours: !input 'hours'
exclude: !input 'exclude'
sensors: "{% set result = namespace(sensors=[]) %}\
\ {% for state in states.sensor | rejectattr('attributes.device_class', 'undefined') | selectattr('attributes.device_class', '==', 'timestamp') %}\
\ {% if 'last_seen' in state.entity_id and not state.entity_id in exclude.entity_id and (states(state.entity_id) == 'unavailable' or ((as_timestamp(now()) - as_timestamp(states(state.entity_id))) > ((hours | int) * 60 * 60))) %}\
\ {% set result.sensors = result.sensors + [state.name | regex_replace(find=' Last seen', replace='') ~ ' (' ~ relative_time(strptime(states(state.entity_id), '%Y-%m-%dT%H:%M:%S%z', 'unavailable')) | replace('hours', 'heures') | replace('minutes', 'min') ~ ')'] %}\
\ {% endif %}\
\ {% endfor %}\
\ {{ result.sensors | join('\n') }}"
trigger:
- platform: time
at: !input 'time'
condition:
- '{{ sensors != '''' and (day | int == 0 or day | int == now().isoweekday()) }}'
action:
- choose: []
default: !input 'actions'
mode: single
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment