Person Cards - Show Off Yours

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

  1. Can you please share input select and how you made just left/just arrived states for person ?
  2. for arrival/departing sensors you use an automation ? because I see is the same sensor
  3. 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

1 Like

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>`;
      }
    ]]]
2 Likes

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.

1 Like

:frowning:
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.

refer to: Person Cards - Show Off Yours - #135 by farao780

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';]]]
1 Like

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!

1 Like

@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?