I can’t find a method to detect new users when they first logon. I’m successfully using this:
- name: browser_users_last_viz
unique_id: browser_users_last_viz
state: >
{% set lastone = integration_entities('browser_mod')|select('contains','browser_visibility')|reject('contains','dji')|expand|sort(attribute='last_changed')|last %}
{{ lastone.name.split(' Browser')[-2] ~' /'~ lastone.state[0] ~';'~lastone.last_changed.isoformat()[0:19] }}
as a trigger to a sensor that keeps track of who is accessing HA. It’s working fine for existing users but not catching new browser_mod entities, despite the use of expand
. It works correctly in developer tools
but does not update the sensor. From reading this Template sensor(s) using "integration_entities" not updating automatically I have created an automation that updates the above sensor when a new entity is created:
alias: new_browser_mod_users
description: Update browser users if a new browser is created
triggers:
- trigger: event
event_type: entity_registry_updated
event_data:
action: create
conditions: []
actions:
- action: homeassistant.update_entity
metadata: {}
data:
entity_id:
- sensor.browser_users_last_viz
mode: single
Which does appear to force an update on the sensor I’m using to trigger logging. However, despite this, no state or last-updated
is available for the new sensors.
FYI the trigger sensor I’m using maintains a little database of each user the number of times they are visible and for how long. It looks like this:
- trigger:
- platform: state
entity_id:
- sensor.browser_users_last_viz
not_to:
- "unavailable"
- "unknown"
for:
seconds: 1
sensor:
- name: browser_users_db_viz
unique_id: browser_users_db_viz
state: "{{ trigger.to_state.state }}"
attributes:
database: >
{% set trig = trigger.to_state.state %}
{% set id = trig.split(' /')[-2] if ' /' in trig else trig %}
{% set ids = 'sensor.' ~ id | slugify ~ '_browser_user' %}
{% set db = dict(this.attributes.get('database', {}).items() | selectattr('0', 'eq', id)) if this.attributes.database != 'undefined' else '' %}
{% set others = dict(this.attributes.get('database', {}).items() | rejectattr('0', 'eq', id)) %}
{% set ids, who = 'sensor.' ~ id | slugify ~ '_browser_user', '' %}
{% set when = trig.split(';')[1] if ';' in trig else as_timestamp(now())|timestamp_custom('%Y-%m-%dT%H:%M:%S') %}
{% set status = trig.split(' /')[1] if ' /' in trig else 'n' %}
{% set status = status.split(';')[-2] if ';' in status else status %}
{% set triggerviz, previz, vizes = status, 'n', 0 %}
{% if states(ids) not in ('unavailable', 'none', 'unknown') %}
{% set who, status = states(ids), status~' states(ids) ok ' %}
{% if states[ids].last_changed not in ( 'none', 'unknown', 'unavailable') %}
{% set when, status = as_timestamp(states[ids].last_changed)|timestamp_custom('%Y-%m-%dT%H:%M:%S'), status~'last_changed ok ' %}
{% endif %}
{% endif %}
{% set prev, dur = '', 0 %}
{% set usr = who %}
{% if db[id] != undefined %}
{% set prev = db[id].when if db[id].when != undefined else '' %}
{% set dur = db[id].for | int(0) if db[id].for != undefined else 0 %}
{% set usr = db[id].user if db[id].user != undefined else usr %}
{% set previz = db[id].status[0] if db[id].status != undefined else previz %}
{% set vizes = db[id].vizes|int if db[id].vizes != undefined else vizes %}
{% set status = status~previz~' db[id] ok ' %}
{% endif %}
{% if previz == 'v' and triggerviz in ('u','h') %}
{% set inc = (as_timestamp(when, 0) - as_timestamp(prev, 0)) | round(0) %}
{% set dur = max(dur + inc, 0) %}
{% set status = status~'dur +'~inc %}
{% endif %}
{% set vizes = vizes + 1.0 if triggerviz == 'v' else vizes %}
{% set new = {id: {'user': usr, 'prev': prev, 'when': when, 'for': dur, 'vizes': vizes, 'status': status }} %}
{% if 'v' in (previz, triggerviz) %}
{{ dict(new, **others) }}
{% else %}
{{ dict(db, **others) }}
{% endif %}
usage: >
{% set trig = trigger.to_state.state %}
{% set id = trig.split(' /')[-2] if ' /' in trig else trig %}
{% set ids = 'sensor.' ~ id | slugify ~ '_browser_user' %}
{% set db = dict(this.attributes.get('database', {}).items() | selectattr('0', 'eq', id)) if this.attributes.database != undefined else '' %}
{% set ids, who = 'sensor.' ~ id | slugify ~ '_browser_user', '' %}
{% set when = trig.split(';')[1] if ';' in trig else as_timestamp(now())|timestamp_custom('%Y-%m-%dT%H:%M:%S') %}
{% set status = trig.split(' /')[1] if ' /' in trig else 'n' %}
{% set status = status.split(';')[-2] if ';' in status else status %}
{% set triggerviz, previz = status, 'n' %}
{% if states(ids) not in ('unavailable', 'none', 'unknown') %}
{% set who, status = states(ids), status~' states(ids) ok ' %}
{% endif %}
{% set prev, dur = '', 0 %}
{% if db[id] != undefined %}
{% set prev = db[id].when if db[id].when != undefined %}
{% set dur = db[id].for | int(0) if db[id].for != undefined %}
{% set previz = db[id].status[0] if db[id].status != undefined %}
{% endif %}
{% if previz == 'v' and triggerviz in ('u','h') %}
{% set inc = (as_timestamp(when, 0) - as_timestamp(prev, 0)) | round(0) %}
{% set dur = max(dur + inc, 0) %}
{% endif %}
{{ dur }}
usage_disp: >
{%- set time = this.attributes.get('usage')|float(0) %}
{%- set minutes = ((time % 3600) // 60)|round(0) %}
{%- set minutes = minutes~'min' if minutes > 0 else '' %}
{%- set hours = ((time % 86400) // 3600)|int %}
{%- set hours = hours~'h:' if hours > 0 else '' %}
{%- set days = (time // 86400)|int %}
{%- set days = days~'d:' if days > 0 else '' %}
{{ days + hours + minutes }}
vizes: >
{% set trig = trigger.to_state.state %}
{% set id = trig.split(' /')[-2] if ' /' in trig else trig %}
{% set ids = 'sensor.' ~ id | slugify ~ '_browser_user' %}
{% set db = dict(this.attributes.get('database', {}).items() | selectattr('0', 'eq', id)) if this.attributes.database != undefined else '' %}
{% set ids = 'sensor.' ~ id | slugify ~ '_browser_user' %}
{% set status = trig.split(' /')[1] if ' /' in trig else 'n' %}
{% set status = status.split(';')[-2] if ';' in status else status %}
{% set triggerviz, vizes = status, 0 %}
{% if states(ids) not in ('unavailable', 'none', 'unknown') %}
{% set vizes = db[id].vizes|int if db[id].vizes != undefined else vizes %}
{% endif %}
{% set vizes = vizes + 1 if triggerviz == 'v' else vizes %}
{{ vizes }}