Sensori conta entità, conta errori e log level con Home Assistant
Aggiornamento del 03/04/2021
Argomento: Configurazioni |
Livello: Novizio (Novizio,Esperto, Pro) |
Difficoltà: Bassa (Bassa, Media, Alta) |
Introduzione
L’articolo presenta alcune configurazioni che risutano molo comode nella nostra configurazione di Home Assistant:
- il sensore conta entità come dice il nome tiene il conto di tutte le entità configurate in Home Assistant esponendo sia il totale complessivo che la numerosità delle entità per singolo dominio.
- Il conteggio degli errori invece tiene traccia degli errori presenti nel log file di Home Assistant, dando quindi una immediata visualizzazione del numero di errori presenti e permettendo di capire eventuli anomalie dovure ad un numero anomalo di errori.
- automazione per variare il default log level di Home Assistant, cioè un’automazione che permette di variare le informazioni che sono raccolte nel file di log di HA.
Sensore conta entità
Il sensore conta entità è un template sensore che espone nel suo stato il conteggio di tutte le entità presenti in Home Assistant e come attributi ha la numerosità dei singoli domini di interesse. Espone anche il valore delle luci e delle automazioni nello stato ON.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
##### - platform: template sensors: count_entities: friendly_name: "Conteggio entità" entity_id: sensor.time value_template: >- {{ states | count }} attribute_templates: automation: > {{ states.automation | count }} automation_ON: >- {{ states.automation | selectattr('state', 'eq', 'on') | list | count }} binary_sensor: >- {{ states.binary_sensor | count }} camera: >- {{ states.camera | count }} climate: >- {{ states.climate | count }} device_tracker: >- {{ states.device_tracker | count }} group: >- {{ states.group | count }} input_boolean: >- {{ states.automation | count }} input_datetime: >- {{ states.input_datetime | count }} input_number: >- {{ states.input_number | count }} input_select: >- {{ states.input_select | count }} input_text: >- {{ states.input_text | count }} media_player: >- {{ states.media_player | count }} light: >- {{ states.light | count }} light_ON: >- {{ states.light | selectattr('state', 'eq', 'on') | rejectattr('attributes.is_hue_group') | list | count }} scene: >- {{ states.scene | count }} script: >- {{ states.script | count }} sensor: >- {{ states.sensor | count }} switch: >- {{ states.switch | count }} zone: >- {{ states.zone | count }} |
Aggiornamento 03/04/2021: il custom-component browser_mod introduce i sensori di tipo light e media_player che volendo si possono disabilitare nella conigurazione del custom. E’ possibile anche non considerare queste entità nel conteggio modificando la configurazione come di seguito:
1 2 3 4 5 |
light: >- {{ states.light | rejectattr('attributes.type','equalto','browser_mod') | list | count }} light_ON: >- {{ states.light | selectattr('state', 'eq', 'on') | rejectattr('attributes.type','equalto','browser_mod') | rejectattr('attributes.is_hue_group') | list | count }} |
Card Lovelace
La parte più complicata è la gestione grafica in Lovelace realizzata con due custom component button-card e card-mod per la gestione avanzata dei CSS (per evitare bordi e spaziature non desiderate). Il risultato è il seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 |
- type: entities style: | ha-card { padding: 0; } .card-content { --ha-card-background: none; --ha-card-box-shadow: none; padding: 0; } entities: - type: custom:hui-markdown-card content: | Totale Domain: {{states|map(attribute='domain')|unique|list|count}} - Totale Entities: {{states('sensor.count_entities')}} - type: custom:hui-horizontal-stack-card cards: - type: 'custom:button-card' color: auto icon: 'mdi:ballot' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Auto: ' + states['sensor.count_entities'].attributes.automation; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:counter' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Auto ON: ' + states['sensor.count_entities'].attributes.automation_ON; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:ceiling-light' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Luci: ' + states['sensor.count_entities'].attributes.light; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:lightbulb-on' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Luci ON: ' + states['sensor.count_entities'].attributes.light_ON; ]]] styles: label: - font-size: 12px ######### - type: custom:hui-horizontal-stack-card cards: - type: 'custom:button-card' color: auto icon: 'mdi:nintendo-switch' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Binary: ' + states['sensor.count_entities'].attributes.binary_sensor; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:camera' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Camera: ' + states['sensor.count_entities'].attributes.camera; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:air-conditioner' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Clima: ' + states['sensor.count_entities'].attributes.climate; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:crosshairs-gps' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Tracker: ' + states['sensor.count_entities'].attributes.device_tracker; ]]] styles: label: - font-size: 12px ###### - type: custom:hui-horizontal-stack-card cards: - type: 'custom:button-card' color: auto icon: 'mdi:ab-testing' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Boolean: ' + states['sensor.count_entities'].attributes.input_boolean; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:timer-sand' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Datetime: ' + states['sensor.count_entities'].attributes.input_datetime; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:numeric' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Number: ' + states['sensor.count_entities'].attributes.input_number; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:format-list-bulleted-square' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Select: ' + states['sensor.count_entities'].attributes.input_select; ]]] styles: label: - font-size: 12px ###### - type: custom:hui-horizontal-stack-card cards: - type: 'custom:button-card' color: auto icon: 'mdi:card-text-outline' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Text: ' + states['sensor.count_entities'].attributes.input_text; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:play-network-outline' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Media: ' + states['sensor.count_entities'].attributes.media_player; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:image-area' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Scene: ' + states['sensor.count_entities'].attributes.scene; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:script-text-outline' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Script: ' + states['sensor.count_entities'].attributes.script; ]]] styles: label: - font-size: 12px ### - type: custom:hui-horizontal-stack-card cards: - type: 'custom:button-card' color: auto icon: 'mdi:gauge-low' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Sensori: ' + states['sensor.count_entities'].attributes.sensor; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:power-socket-eu' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Switch: ' + states['sensor.count_entities'].attributes.switch; ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:group' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Gruppi: ' + states['sensor.count_entities'].attributes.group ]]] styles: label: - font-size: 12px - type: 'custom:button-card' color: auto icon: 'mdi:earth' aspect_ratio: 2/1 show_label: true label: | [[[ return 'Zone: ' + states['sensor.count_entities'].attributes.zone ]]] styles: label: - font-size: 12px ########################################## |
Conteggio errori
La realizzazione di questa misurazione è effettuata tramite un’entità counter e un’automazione basata sulla rilevazione tramite “trigger” dell’evento system_log_event con parametro “ERROR”, l’“action” invece incrementa una entità di tipo counter; il risultato è quindi il conteggio degli eventi di errore di Home Assistant appena si verificano.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
################################################################# # # # Counter # # # ################################################################# counter: error_counter: name: Conteggio Errori icon: mdi:alert ################################################################# # # # System LOG # # # ################################################################# system_log: fire_event: true ################################################################# # # # Automations # # # ################################################################# automation: - alias: Error Counting Automation initial_state: true trigger: platform: event event_type: system_log_event event_data: level: ERROR action: - service: counter.increment entity_id: counter.error_counter |
Se lo si desidera si può aggiungere una notifica per ogni errore rilevato, ma lo sconsiglio fortemente 🙂
Per la visualizzazione Lovelace basta una semplice entities card oppure una entity card:
1 2 3 4 5 6 7 8 9 |
#### - type: entities show_header_toggle: false entities: - entity: counter.error_counter name: Errori log HA #### - type: entity entity: counter.error_counter |
Default Log Level
Il file di log raccoglie tutta una serie di eventi che accadono durante il funzionamento di Home Assistant, il logging level rappresenta la tipologia di evento suddivisa in un certo numero di livelli. Home Assistant prevede 8 livelli possibili, mentre in letteratura di solito ne sono indicati 7, che ho rassunto di seguito (escludendo il livello ALL) in ordine crescente di importanza o “severità”:
- FATAL. rappresenta situazioni veramente catastrofiche per quanto riguarda il funzionamento dell’applicazione.
- ERROR. Un errore è un problema serio e rappresenta il fallimento di qualcosa di importante nella tua applicazione. Un errore per esempio è una interruzione di connessioni al database o l’impossibilità di accedere a un file o servizio. In generale qualsiasi errore fatale per l’operazione, ma non per il servizio o l’applicazione.
- WARN. Si utilizza il livello WARN per indicare che si potrebbe avere un problema o che è stata rilevata una situazione insolita, ma non è stato fatto alcun danno reale.
- INFO. I messaggi INFO corrispondono al normale comportamento dell’applicazione. Sono informazioni utili per la registrazione (avvio / arresto) di un servizio, ecc.. In generale sono informazioni che voglio avere disponibili ma di solito non mi interessano in circostanze normali.
- DEBUG. Con DEBUG, si raccolgono informazioni diagnostiche dettagliate.
- NOT-SET (off). Non registra nulla.
Home assistant mette a disposizione due servizi per variare il livello di logging:
- set_default_level: permette d configurare il livello generale di logging
- set_level: permette di configurare il livello di logging di ogni singola integrazione
Il codice proposto permette di selezionare il default_level traimite un input_select che elenca gli 8 livelli possibili di log; scegliendo il livello si innesca l’automazione che cambia il log level e invia un messaggio Telegram (ovviamente occorre personalizzare il servizio di notifica con il proprio servizio).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
################################################################# # # # Input Select # # # ################################################################# input_select: default_log_level: name: Default log level options: - critical - fatal - error - warning - warn - info - debug - notset initial: error ################################################################# # # # Automations # # # ################################################################# automation: - alias: Default Log Level initial_state: true trigger: - platform: state entity_id: input_select.default_log_level action: - service: logger.set_default_level data_template: level: "{{ trigger.to_state.state }}" - service: notify.telegram data_template: title: "-- HA Logging Level --" message: "Default Log level cambiato in {{ trigger.to_state.state }}" |
Una risposta.
Ciao io avrei necessità di visualizzare il numero di volte che viene invocata l’apertura di un cancello (switch.esp_citofono_1). Mi sapresti aiutare nella creazione del sensore apposito?
Ho creato questo:
– platform: history_stats
name: CARRAIO number
entity_id: switch.esp_citofono_1
state: “on”
type: count
start: “{{ 0 }}”
end: “{{ now() }}”
ma non si incrementa