Firstly, love your person card setup. I’ve more or less recreated it on mine, but with one huge exception; it looks nothing like yours. I’m almost certain that it has to do with the theme - would you mind please sharing what theme you’ve used?
Gladly… I’m using a theme called Midnight.
I load it through automation like this:
- alias: 01 - Set Default Theme to Midnight on Startup
id: Set Default Theme to Midnight on Startup
initial_state: true
trigger:
- event: start
platform: homeassistant
action:
- data:
name: midnight
service: frontend.set_theme
it’s located in this file…
Midnight Theme
This is in a file called themes.yaml
But also make sure you have -
stack-in-card
mushroom card
both loaded…
Here’s what mine looks like now I’m sure i"ve changed it since that post:
- type: custom:stack-in-card
mode: vertical
card_mod:
style: |
ha-card {
background-color: rgba(255, 255, 255, .1);
border: 0 !important;
}
cards:
- type: custom:stack-in-card
mode: horizontal
card_mod:
style: |
ha-card {
border: 0 !important;
}
cards:
- type: custom:mushroom-person-card
entity: person.john
icon: " "
icon_type: icon
primary_info: none
secondary_info: none
card_mod:
style: |
mushroom-card {
background: url( {{ state_attr('person.john', 'entity_picture') }} ) no-repeat 0px center;
background-size: 42px 42px;
border: 0 !important;
}
ha-card {
background-color: rgba(255, 255, 255, .7);
margin-left: auto;
margin-right: auto;
width: 66px;
border: 0 !important;
}
- type: conditional
card_mod:
style: |
ha-card {
border: 0 !important;
}
conditions:
- entity: sensor.sm_f926u1_battery_state
state: "charging"
card:
type: custom:mushroom-template-card
entity: sensor.sm_f926u1_battery_level
layout: vertical
icon_color: yellow
fill_container: true
name: Fold3
icon: mdi:battery-charging-medium
hide_name: true
primary: "Phone is charging..."
secondary: "Battery Level: {{ states('sensor.sm_f926u1_battery_level') }}%"
card_mod:
style: |
mushroom-shape-icon {
animation: blink 1s linear infinite;
}
@keyframes blink {
50% {opacity: 0;}
}
ha-card {
border: 0 !important;
}
- type: conditional
conditions:
- entity: sensor.sm_f926u1_battery_state
state: "full"
card:
type: custom:mushroom-template-card
card_mod:
style: |
ha-card {
border: 0 !important;
}
entity: sensor.sm_f926u1_battery_level
layout: vertical
icon: |2
{% set bl = states('sensor.sm_f926u1_battery_level') | int %}
{% if bl < 10 %} mdi:battery-outline
{% elif bl < 20 %} mdi:battery-10
{% elif bl < 30 %} mdi:battery-20
{% elif bl < 40 %} mdi:battery-30
{% elif bl < 50 %} mdi:battery-40
{% elif bl < 60 %} mdi:battery-50
{% elif bl < 70 %} mdi:battery-60
{% elif bl < 80 %} mdi:battery-70
{% elif bl < 90 %} mdi:battery-80
{% elif bl < 100 %} mdi:battery-90
{% elif bl == 100 %} mdi:battery
{% else %} mdi:battery-unknown
{% endif %}
icon_color: |2-
{% set bl = states('sensor.sm_f926u1_battery_level') | int %}
{% if bl < 10 %} #cc0c16
{% elif bl < 20 %} #e61e28
{% elif bl < 30 %} #e3464e
{% elif bl < 40 %} orange
{% elif bl < 50 %} #f0b93a
{% elif bl < 60 %} #f3f56c
{% elif bl < 70 %} #f2f536
{% elif bl < 80 %} #69f095
{% elif bl < 90 %} #2ee669
{% elif bl < 100 %} #05ad3b
{% elif bl == 100 %} #03872d
{% else %} grey
{% endif %}
primary: "Battery Level: {{ states('sensor.sm_f926u1_battery_level') }}%"
secondary: "Battery Temp: {{ states('sensor.sm_f926u1_battery_temperature') }}°"
tap_action:
action: more-info
fill_container: true
- type: conditional
card_mod:
style: |
ha-card {
border: 0 !important;
}
conditions:
- entity: sensor.sm_f926u1_battery_state
state: "discharging"
card:
type: custom:mushroom-template-card
card_mod:
style: |
ha-card {
border: 0 !important;
}
entity: sensor.sm_f926u1_battery_level
layout: vertical
icon: |2
{% set bl = states('sensor.sm_f926u1_battery_level') | int %}
{% if bl < 10 %} mdi:battery-outline
{% elif bl < 20 %} mdi:battery-10
{% elif bl < 30 %} mdi:battery-20
{% elif bl < 40 %} mdi:battery-30
{% elif bl < 50 %} mdi:battery-40
{% elif bl < 60 %} mdi:battery-50
{% elif bl < 70 %} mdi:battery-60
{% elif bl < 80 %} mdi:battery-70
{% elif bl < 90 %} mdi:battery-80
{% elif bl < 100 %} mdi:battery-90
{% elif bl == 100 %} mdi:battery
{% else %} mdi:battery-unknown
{% endif %}
icon_color: |2-
{% set bl = states('sensor.sm_f926u1_battery_level') | int %}
{% if bl < 10 %} #cc0c16
{% elif bl < 20 %} #e61e28
{% elif bl < 30 %} #e3464e
{% elif bl < 40 %} orange
{% elif bl < 50 %} #f0b93a
{% elif bl < 60 %} #f3f56c
{% elif bl < 70 %} #f2f536
{% elif bl < 80 %} #69f095
{% elif bl < 90 %} #2ee669
{% elif bl < 100 %} #05ad3b
{% elif bl == 100 %} #03872d
{% else %} grey
{% endif %}
primary: "Battery Level: {{ states('sensor.sm_f926u1_battery_level') }}%"
secondary: "Battery Temp: {{ states('sensor.sm_f926u1_battery_temperature') }}°"
tap_action:
action: more-info
fill_container: true
styles:
card:
height: 66px;
- type: custom:mushroom-template-card
entity: sensor.john
card_mod:
style: |
ha-card {
border: 0 !important;
}
primary: >
{% if (state_attr('sensor.john', 'direction_of_travel') == 'stationary') and (state_attr('sensor.john','home_zone') == 'zone.home') %}
John is Home:
{% elif (state_attr('sensor.john', 'direction_of_travel') == 'stationary')%}
John is Here:
{% else %}
John is
{% endif %}
secondary: >
{% if (state_attr('sensor.john','direction_of_travel') == 'stationary') %}
{{ state_attr('sensor.john','street_number') }} {{
state_attr('sensor.john','street') }}, {{
state_attr('sensor.john','city') }}, {{
state_attr('sensor.john','postal_code') }}
{% else %}
Traveling...
{% endif %}
icon: >-
{% if (state_attr('sensor.john','direction_of_travel') == 'stationary') and (states('device_tracker.sm_f926u1') == 'home') %} mdi:home-account
{% elif (state_attr('sensor.john','direction_of_travel') == 'stationary') and (states('device_tracker.sm_f926u1') == 'not_home') %} mdi:domain
{% else %} mdi:car
{% endif %}
icon_color: >-
{% if (state_attr('sensor.john','direction_of_travel') == 'stationary') and (states('device_tracker.sm_f926u1') == 'home') %} green
{% elif (state_attr('sensor.john','direction_of_travel') == 'stationary') and (states('device_tracker.sm_f926u1') == 'not_home') %} blue
{% else %} cyan
{% endif %}
tap_action:
action: fire-dom-event
browser_mod:
title: John's Location
icon: mdi:car
service: browser_mod.popup
data:
size: normal
title: Where is John?
style: |-
--popup-min-width: 500px; --popup-max-width: 670px;
--popup-border-radius: 0 !important;
--popup-background-color: #B33B00;
--popup-border-width: 0 !important;
content:
type: map
default_zoom: 15
entities:
- device_tracker.sm_f926u1
aspect_ratio: 16:9
hours_to_show: 4
browser_id:
- this
- dashboard
multiline_secondary: true
hello DeltaNu1142,
Love your card.
Some (silly) questions, due to not having entire workframe in your code, also not node-red user
- Can you please share input select and how you made just left/just arrived states for person ?
- for arrival/departing sensors you use an automation ? because I see is the same sensor
- i see as a result that sensor is telling me i stay home from 11:13 PM, but I want to have 24h display, not AM/PM. what can do the trick ?
Thank you
I’d love to provide more information, but right now my device_trackers are broken. My input_selects for user status is statused by a Node-RED flow.
OK, I’m back on track. Here are some updated sensors. The arrival and departure sensors are the same, except for when they’re triggered. Note I’ve made some changes to the sensor names for consistency, and I’ve added the update card YAML as well.
Sensors:
- sensor:
- unique_id: distance_from_home_Person2
name: Distance from Home Person2
state: >
{{ distance('person.Person2','zone.home') | round(1) }}
- sensor:
- unique_id: distance_from_home_Person1
name: Distance from Home Person1
state: >
{{ distance('person.Person1','zone.home') | round(1) }}
- trigger:
- platform: state
entity_id: person.Person2
to: 'home'
sensor:
- unique_id: time_arrived_home_Person2
name: Time Arrived Home Person2
icon: "mdi-home-clock"
state: >
{% set last_changed = states.person.Person2.last_changed | as_local %}
{% if last_changed < today_at() - timedelta(days=1) %}
{{ last_changed.strftime('%A at %-I:%M %p') }}
{% elif last_changed < today_at() %}
{{ last_changed.strftime('yesterday %-I:%M %p') }}
{% else %}
{{ last_changed.strftime('at %-I:%M %p') }}
{% endif %}
- trigger:
- platform: state
entity_id: person.Person1
to: 'home'
sensor:
- unique_id: time_arrived_home_Person1
name: Time Arrived Home Person1
icon: "mdi-home-clock"
state: >
{% set last_changed = states.person.Person1.last_changed | as_local %}
{% if last_changed < today_at() - timedelta(days=1) %}
{{ last_changed.strftime('%A at %-I:%M %p') }}
{% elif last_changed < today_at() %}
{{ last_changed.strftime('yesterday %-I:%M %p') }}
{% else %}
{{ last_changed.strftime('at %-I:%M %p') }}
{% endif %}
- trigger:
- platform: state
entity_id: person.Person2
from: 'home'
sensor:
- unique_id: time_left_home_Person2
name: Time Left Home Person2
icon: "mdi-home-clock"
state: >
{% set last_changed = states.person.Person2.last_changed | as_local %}
{% if last_changed < today_at() - timedelta(days=1) %}
{{ last_changed.strftime('%-I:%M %p on %A') }}
{% elif last_changed < today_at() %}
{{ last_changed.strftime('%-I:%M %p yesterday') }}
{% else %}
{{ last_changed.strftime('%-I:%M %p') }}
{% endif %}
- trigger:
- platform: state
entity_id: person.Person1
from: 'home'
sensor:
- unique_id: time_left_home_Person1
name: Time Left Home Person1
icon: "mdi-home-clock"
state: >
{% set last_changed = states.person.Person1.last_changed | as_local %}
{% if last_changed < today_at() - timedelta(days=1) %}
{{ last_changed.strftime('%-I:%M %p on %A') }}
{% elif last_changed < today_at() %}
{{ last_changed.strftime('%-I:%M %p yesterday') }}
{% else %}
{{ last_changed.strftime('%-I:%M %p') }}
{% endif %}
Card:
type: custom:button-card
entity: sensor.status_person1
aspect_ratio: 1/1
name: person1
show_entity_picture: true
show_name: false
hold_action:
action: none
state:
- value: Home
styles:
custom_fields:
icon:
- border-color: '#36c570'
- value: Just Arrived
styles:
custom_fields:
icon:
- border-color: '#36c570'
- value: Zone1
styles:
card: null
custom_fields:
icon:
- border-color: '#4456e5'
- value: Zone2
styles:
card: null
custom_fields:
icon:
- border-color: '#4456e5'
- value: Zone3
styles:
card: null
custom_fields:
icon:
- border-color: '#4456e5'
- value: Just Left
styles:
card: null
custom_fields:
icon:
- border-color: '#e54456'
- value: default
styles:
card: null
custom_fields:
icon:
- border-color: '#e54456'
styles:
card:
- background-color: rgba(7, 103, 215, 0.24)
- border-radius: 5%
- padding: 5%
- color: gray
- font-size: 10px
- text-shadow: 0px 0px 0px black
- justify-self: end
- align-self: middle
grid:
- grid-template-areas: >-
"icon status" "n n" "homeclock waze" "batterydistance wifidrivetime" "sd
sd"
- grid-template-columns: 2fr 1fr
- grid-template-rows: 1fr min-content min-content min-content min-content
name:
- font-size: 15px
- align-self: middle
- justify-self: start
- padding-bottom: 10px
custom_fields:
icon:
- clip-path: circle()
- width: 80%
- pointer-events: none
- display: grid
- border: 5px solid
- border-color: gray
- border-radius: 500px
- margin: 0 +10% 0 0
- justify-self: end
- opacity: 1
status:
- align-self: start
- justify-self: end
- color: white
homeclock:
- padding: 0.5em 0px
- align-self: middle
- justify-self: start
- color: white
wifidrivetime:
- padding: 0.5em 0px
- align-self: left
- justify-self: end
- color: white
batterydistance:
- padding: 0.5em 0px
- align-self: middle
- justify-self: start
- color: white
waze:
- padding: 0.5em 0px
- align-self: left
- justify-self: end
- color: white
- '--text-color-sensor': >-
[[[ if (states["sensor.waze_travel_time_person1"].state > 60) return
"#EF4F1A"; ]]]
custom_fields:
icon: >
[[[ return entity === undefined ? null : `<img
src="${states[entity.entity_id].attributes.entity_picture}" width="100%">`;
]]]
status: |
[[[
if (states['person.person1'].state !='home') {
return `<ha-icon icon="mdi:home-export-outline"
style="width: 20px; height: 20px; color: '#888888';">
</ha-icon><span> ${states['sensor.status_person1'].state}</span>`;
}
if (states['person.person1'].state =='home') {
return `<ha-icon
icon="mdi:home"
style="width: 20px; height: 20px; color: #ffffff;">
</ha-icon><span> ${states['sensor.status_person1'].state}</span>`;
} else {
return `<ha-icon
icon="mdi:map-marker-radius"
style="width: 20px; height: 20px; color: #ffffff;">
</ha-icon><span> ${states['sensor.status_person1'].state}</span>`;
}
]]]
homeclock: |
[[[
if (states['person.person1'].state !='home') {
return `<ha-icon
icon="mdi:home-clock"
style="width: 20px; height: 20px; color: #ffffff;">
</ha-icon><span> Left ${states['sensor.time_left_home_person1'].state}</span>`;
}
if (states['person.person1'].state =='home') {
return `<ha-icon
icon="mdi:home-clock"
style="width: 20px; height: 20px; color: #ffffff;">
</ha-icon><span> Arrived ${states['sensor.time_arrived_home_person1'].state}</span>`;
} else {
return
}
]]]
waze: |
[[[
return ;
]]]
batterydistance: |
[[[
if (states['person.person1'].state != 'home' && states['sensor.distance_from_home_person1'].state <= 5) {
return `<ha-icon
icon="mdi:map-marker-distance"
style="width: 20px; height: 20px; color: #36c570;">
</ha-icon> <span>\<span style="color: #36c570;">${states['sensor.distance_from_home_person1'].state} mi</span></span>`;
}
if (states['person.person1'].state != 'home' && states['sensor.distance_from_home_person1'].state > 5) {
return `<ha-icon
icon="mdi:map-marker-distance"
style="width: 20px; height: 20px; color: white;">
</ha-icon> <span>\<span style="color: white;">${states['sensor.distance_from_home_person1'].state} mi</span></span>`;
}
if (states['sensor.person1s_iphone_battery_state'].state == 'charging') {
return `<ha-icon
icon="mdi:battery-charging"
style="width: 20px; height: 20px; color: #36c570;">
</ha-icon> <span><span style="color: #36c570;">${states['sensor.person1s_iphone_battery_level'].state}%</span></span>`;
} else {
return `<ha-icon
icon="mdi:battery"
style="width: 20px; height: 20px; color: white;">
</ha-icon> <span><span style="color: var(--text-color-sensor);">${states['sensor.person1s_iphone_battery_level'].state}%</span></span>`;
}
]]]
wifidrivetime: |
[[[
if (states['person.person1'].state != 'home' && states['sensor.waze_travel_time_person1'].state <= 5) {
return `<ha-icon
icon="mdi:car-clock"
style="width: 20px; height: 20px; color: #36c570;">
</ha-icon> <span>\<span style="color: #36c570;">${states['sensor.waze_travel_time_person1'].state} min</span></span>`;
}
if (states['person.person1'].state != 'home' && states['sensor.waze_travel_time_person1'].state > 5) {
return `<ha-icon
icon="mdi:car-clock"
style="width: 20px; height: 20px; color: white;">
</ha-icon> <span>\<span style="color: white;">${states['sensor.waze_travel_time_person1'].state} min</span></span>`;
}
if (states['person.person1'].state == 'home' && states['sensor.person1s_iphone_ssid'].state == 'Not Connected') {
return `<ha-icon
icon="mdi:wifi-off"
style="width: 20px; height: 20px; color: var(--text-wifi-color-sensor);">
</ha-icon> <span>\<span style="color: var(--text-wifi-color-sensor);">Disconnected</span></span>`;
} else {
return `<ha-icon
icon="mdi:wifi"
style="width: 20px; height: 20px; color: white;">
</ha-icon> <span><span style="color: var(--text-color-sensor);">${states['sensor.person1s_iphone_ssid'].state}</span></span>`;
}
]]]
Glad you are back on track.
How can I do that part without node-red?
- trigger:
- platform: state
entity_id: person.Person1
from: 'home'
sensor:
- unique_id: time_left_home_Person1
name: Time Left Home Person1
icon: "mdi-home-clock"
state: >
{% set last_changed = states.person.Person1.last_changed | as_local %}
{% if last_changed < today_at() - timedelta(days=1) %}
{{ last_changed.strftime('%-I:%M %p on %A') }}
{% elif last_changed < today_at() %}
{{ last_changed.strftime('%-I:%M %p yesterday') }}
{% else %}
{{ last_changed.strftime('%-I:%M %p') }}
{% endif %}
Which part, the Home/Away/Just Arrived/Just Left/Extended Away status-ing? Well, I admit I’m not much of a coder, which is why Node-RED was so appealing to me in the first place. Here’s the flow for your review. I’m sure it could be replicated in an automation, but you’d be better off asking a house plant how to do that:
[{"id":"558a8b2b9a9690f8","type":"group","z":"647eafda.c7cfa","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["ce09e65.8f84418","4d8f933f.aa124c","e76d582a.9a8f88","241457b2.2cc128","d5810a67.0f3498","c0187e63.5a9e1","6a5f8f00.23807","8bd1d643.a115e8","712d8721.d63168","c1544077.8f84a","4f5a58f6.75a848","ead2621a.497e1","af79d26f.7b667","4b97a8c9.4c2298","c9866881fd8d599e","3f7bf5cad74c8219"],"x":44,"y":19,"w":1242,"h":182},{"id":"ce09e65.8f84418","type":"switch","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Home?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"home","vt":"str"},{"t":"eq","v":"not_home","vt":"str"}],"checkall":"false","repair":false,"outputs":2,"x":360,"y":120,"wires":[["4d8f933f.aa124c","6a5f8f00.23807","8bd1d643.a115e8"],["ead2621a.497e1","712d8721.d63168"]]},{"id":"4d8f933f.aa124c","type":"api-current-state","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Status?","server":"296c0678.b5f9ca","version":3,"outputs":2,"halt_if":"Just Left","halt_if_type":"str","halt_if_compare":"is_not","entity_id":"input_select.{{topic}}","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":500,"y":100,"wires":[["241457b2.2cc128"],["c1544077.8f84a"]]},{"id":"e76d582a.9a8f88","type":"api-call-service","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Just Left","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"input_select","service":"select_option","areaId":[],"deviceId":[],"entityId":[],"data":"{\"entity_id\":\"input_select.{{topic}}\",\"option\":\"Just Left\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":640,"y":140,"wires":[["6a5f8f00.23807"]]},{"id":"241457b2.2cc128","type":"api-call-service","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Just Arrived","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"input_select","service":"select_option","areaId":[],"deviceId":[],"entityId":[],"data":"{\"entity_id\":\"input_select.{{topic}}\",\"option\":\"Just Arrived\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":650,"y":80,"wires":[["712d8721.d63168","3f7bf5cad74c8219"]]},{"id":"d5810a67.0f3498","type":"api-call-service","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Away","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"input_select","service":"select_option","areaId":[],"deviceId":[],"entityId":[],"data":"{\"entity_id\":\"input_select.{{topic}}\",\"option\":\"Away\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":160,"wires":[["8bd1d643.a115e8"]]},{"id":"c0187e63.5a9e1","type":"api-call-service","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Extended Away","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"input_select","service":"select_option","areaId":[],"deviceId":[],"entityId":[],"data":"{\"entity_id\":\"input_select.{{topic}}\",\"option\":\"Extended Away\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1180,"y":140,"wires":[[]]},{"id":"6a5f8f00.23807","type":"trigger","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"10min","op1":"","op2":"{\"payload\":{\"data\":{\"option\":\"\"}}}","op1type":"nul","op2type":"json","duration":"10","extend":false,"units":"min","reset":"home","bytopic":"topic","outputs":1,"x":810,"y":160,"wires":[["d5810a67.0f3498"]]},{"id":"8bd1d643.a115e8","type":"trigger","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"24hr","op1":"","op2":"{\"payload\":{\"data\":{\"option\":\"\"}}}","op1type":"nul","op2type":"json","duration":"24","extend":false,"units":"hr","reset":"home","bytopic":"topic","outputs":1,"x":1050,"y":140,"wires":[["c0187e63.5a9e1"]]},{"id":"712d8721.d63168","type":"trigger","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"10min","op1":"","op2":"{\"payload\":{\"data\":{\"option\":\"\"}}}","op1type":"nul","op2type":"json","duration":"10","extend":false,"units":"min","reset":"not_home","bytopic":"topic","outputs":1,"x":810,"y":100,"wires":[["c1544077.8f84a"]]},{"id":"c1544077.8f84a","type":"api-call-service","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Home","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"input_select","service":"select_option","areaId":[],"deviceId":[],"entityId":[],"data":"{\"entity_id\":\"input_select.{{topic}}\",\"option\":\"Home\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":100,"wires":[[]]},{"id":"4f5a58f6.75a848","type":"trigger-state","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Person","server":"296c0678.b5f9ca","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"^person\\..*$","entityidfiltertype":"regex","debugenabled":false,"constraints":[{"targetType":"this_entity","targetValue":"","propertyType":"current_state","propertyValue":"new_state.state","comparatorType":"is_not","comparatorValueDatatype":"prevEntity","comparatorValue":"state"}],"inputs":1,"outputs":2,"customoutputs":[],"outputinitially":false,"state_type":"str","enableInput":true,"x":120,"y":120,"wires":[["af79d26f.7b667"],[]]},{"id":"ead2621a.497e1","type":"api-current-state","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Status?","server":"296c0678.b5f9ca","version":3,"outputs":2,"halt_if":"Just Left,Away, Extended Away","halt_if_type":"str","halt_if_compare":"does_not_include","entity_id":"input_select.{{topic}}","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":500,"y":140,"wires":[["e76d582a.9a8f88"],[]]},{"id":"af79d26f.7b667","type":"change","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Change","rules":[{"t":"change","p":"topic","pt":"msg","from":"person.","fromt":"str","to":"","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"payload = \"home\" ? \"home\" : \"not_home\"","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":215,"y":120,"wires":[["4b97a8c9.4c2298"]],"l":false},{"id":"4b97a8c9.4c2298","type":"rbe","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":265,"y":120,"wires":[["ce09e65.8f84418"]],"l":false},{"id":"c9866881fd8d599e","type":"comment","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Home Occupancy","info":"","x":1110,"y":80,"wires":[]},{"id":"3f7bf5cad74c8219","type":"link out","z":"647eafda.c7cfa","g":"558a8b2b9a9690f8","name":"Anyone Arrives Home","mode":"link","links":["aeb93daa0114a684"],"x":775,"y":60,"wires":[]},{"id":"296c0678.b5f9ca","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
The Link node is only there because I use the “Just Arrived” state in other flows.
don’t understand.
You trigger something I suppose an automation when person1 leaves home, but how you define sensor time_left_home_person1 ? or you update it ?
I think you’re referring to the quoted YAML from this post, right?
This is a template sensor, and the trigger (when the state of Person1 changes from ‘home’ to something else) causes the entity to record the time of the state change.
That is a template sensor, not done in Node-RED at all. You can place this in your configuration.yaml file as described here.
done that. sensors looking good. now you update sensors via calling service homeassistant.update entity? because both arrived and left sensors show same thing.
or what is the purpose of:
- trigger:
- platform: state
entity_id: person.Person1
from: 'home'
@VaReTaS, I don’t suppose you know how I’d add multiple conditions to this statement:
batterydistance:
[...]
[[[ if (states["sensor.Person1s_iphone_battery_level"].state < 50)
return "#EF4F1A"; ]]]
?
I tried this:
batterydistance:
[...]
[[[ if ((states["sensor.Person1s_iphone_battery_level"].state < 50) and (states['sensor.distance_from_home_Person1'].state <= 2))
return "#EF4F1A"; ]]]
…but it didn’t work for me.
…that’s the purpose of the triggers. For one sensor, it triggers the timestamp to be written as the sensor value when Person1 leaves the zone, and for the other sensor, it triggers when Person1 arrives at the zone.
There’s likely a better way to do it. I could probably get away with using just one sensor per person, and then using a conditional statement in the card. This is just the way I did it because–and I reiterate–I’m not a programmer.
thank you for patience
i’m almost there
how can i align home to arrived (not to be in upper right corner , but just above ssid
i have something like that and working:
- '--text-color-sensor': >-
[[[
if (entity.state < 60) return 'lime';
if (entity.state >= 60 && entity.state < 80) return 'orange';
else return 'red';]]]
Take all of the content of status:
and switch it with the content of waze:
. These are the labels of the elements in these cards, but they’re not accurate to the actual contents!
@DeltaNu1142 . I am trying to replicate your person cards but I got stuck on the sensor: " sensor.status_Person1". Is that the same thing as the entity: person.person1 or you created separately?
I created all the sensors you mentioned in your yaml code but did not get the sensor.status_person1.
Thank you !
You could use person.person1 and adapt the values to suit your needs. That would probably be the easiest thing to do.
Other than person.xxx, I have two sensors for each person that give more detail on location/status:
- input_select.person1 - this provides one of five states, Home/Away/Just Left/Just Arrived/Extended Away. These are managed by a Node-RED flow described above.
- sensor.person1 - I take the value from input_select.person1, and set that as the state of sensor.person1 if it’s Home, Just Arrived, or Just Left. If person.person1 is Away (or not_home, I think it’s changed over time), I set it to the value of what’s listed in the Locality attribute of person1’s geocoded location.If none of those conditions are met, I set it to the states of person.person1, which is usually a zone name. Here’s the template for that:
- sensor:
- unique_id: status_person1
name: Status Person1
picture: local/person1.jpg
state: >
{% if is_state('input_select.person1', 'Just Left')
or is_state('input_select.person1', 'Just Arrived')
or is_state('input_select.person1', 'Home') %}
{{ states('input_select.person1') }}
{% elif is_state('person.person1','Away') or is_state('person.person1','not_home') %}
{{ state_attr('sensor.person1_geocoded_location', 'Locality') }}
{% else %}
{{ states('person.person1') }}
{% endif %}
I could probably do the same thing with just person.person1 and one other sensor, but this thing grew over time, so I started with one and now I have two.
EDIT: I’m constantly changing these cards. I updated my YAML above.
Thank you very much for the quick response. I appreciate that. I like the sensor status idea better than person.person1 entity. However, can this be achieved without having Node-RED?