Contents
Intro
Dans cet article, je vous explique comment surveiller les métriques d’un PC distant sous Linux (CPU, RAM, disque, etc.) à l’aide de Prometheus Node Exporter et les afficher dans Home Assistant avec une carte visuelle. Ce tutoriel est basé sur ma configuration pour surveiller mon PC de bureau depuis un serveur Proxmox exécutant une instance LXC de Prometheus, intégrée à Home Assistant.
Prérequis
Avant de commencer, assurez-vous d’avoir :
- Un PC distant sous Linux avec Prometheus Node Exporter installé.
- Une instance Prometheus configurée (ici, une LXC sur Proxmox).
- Home Assistant installé et configuré.
- Les ports nécessaires ouverts (9100 pour Node Exporter, 9090 pour Prometheus).
- Une connaissance de base des fichiers YAML et des requêtes PromQL.
- Les composants personnalisés HACS :
custom:layout-card
,custom:mini-graph-card
,custom:bar-card
.
Étape 1 : Configurer Prometheus Node Exporter
Sur le PC distant (IP 192.168.0.160
), installez Prometheus Node Exporter pour collecter les métriques système :
sudo apt update
sudo apt install prometheus-node-exporter
Activez et démarrez le service :
sudo systemctl enable prometheus-node-exporter
sudo systemctl start prometheus-node-exporter
Ouvrez le port 9100 :
sudo ufw allow 9100/tcp
Vérifiez que Node Exporter fonctionne en accédant à http://192.168.0.160:9100/metrics
.
Étape 2 : Configurer Prometheus
Sur le serveur Proxmox (IP 192.168.0.205
), configurez Prometheus pour collecter les données du PC distant. Modifiez le fichier /etc/prometheus/prometheus.yml
:
scrape_configs:
- job_name: 'pc_bureau'
static_configs:
- targets: ['192.168.0.160:9100']
Redémarrez Prometheus :
sudo systemctl restart prometheus
Vérifiez la collecte des données via l’interface web de Prometheus : http://192.168.0.205:9090
.
Étape 3 : Intégrer les métriques dans Home Assistant
Ajoutez les capteurs suivants dans le fichier configuration.yaml
de Home Assistant pour récupérer les métriques via l’API de Prometheus :
sensor:
- platform: rest
name: PC Bureau - Uptime secondes
unique_id: pc_bureau_prometheus_uptime
resource: "http://192.168.0.205:9090/api/v1/query?query=node_time_seconds - node_boot_time_seconds"
value_template: >
{% set res = value_json.data.result %}
{% if res and res[0].value %}
{{ res[0].value[1] | float | round(1) }}
{% else %}
0.0
{% endif %}
unit_of_measurement: 's'
scan_interval: 300
- platform: rest
name: PC Bureau - RAM utilisée %
unique_id: pc_bureau_ram_util
resource: "http://192.168.0.205:9090/api/v1/query?query=(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100"
value_template: >
{% set res = value_json.data.result %}
{% if res and res[0].value %}
{{ res[0].value[1] | float | round(1) }}
{% else %}
0.0
{% endif %}
unit_of_measurement: '%'
scan_interval: 60
- platform: rest
name: PC Bureau - Disque Root utilisé %
unique_id: pc_bureau_root_disk
resource: "http://192.168.0.205:9090/api/v1/query?query=(node_filesystem_size_bytes{mountpoint=\"/\"} - node_filesystem_free_bytes{mountpoint=\"/\"}) / node_filesystem_size_bytes{mountpoint=\"/\"} * 100"
value_template: >
{% set res = value_json.data.result %}
{% if res and res[0].value %}
{{ res[0].value[1] | float | round(1) }}
{% else %}
0.0
{% endif %}
unit_of_measurement: '%'
scan_interval: 600
- platform: rest
name: PC Bureau - Utilisation CPU %
unique_id: pc_bureau_cpu_util
resource: "http://192.168.0.205:9090/api/v1/query?query=100 - (avg by(instance)(rate(node_cpu_seconds_total{mode=\"idle\"}[1m])) * 100)"
value_template: >
{% set res = value_json.data.result %}
{% if res and res[0].value %}
{{ res[0].value[1] | float | round(1) }}
{% else %}
0.0
{% endif %}
unit_of_measurement: '%'
scan_interval: 60
- platform: rest
name: PC Bureau - Charge CPU 1min
unique_id: pc_bureau_load1
resource: "http://192.168.0.205:9090/api/v1/query?query=node_load1{job=\"pc_bureau\"}"
value_template: >
{% set res = value_json.data.result %}
{% if res and res[0].value %}
{{ res[0].value[1] | float | round(1) }}
{% else %}
0.0
{% endif %}
unit_of_measurement: load
scan_interval: 60
- platform: rest
name: PC Bureau - Swap utilisée %
unique_id: pc_bureau_swap_util
resource: "http://192.168.0.205:9090/api/v1/query?query=(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100"
value_template: >
{% set res = value_json.data.result %}
{% if res and res[0].value %}
{{ res[0].value[1] | float | round(1) }}
{% else %}
0.0
{% endif %}
unit_of_measurement: '%'
scan_interval: 60
Ces capteurs récupèrent l’uptime, l’utilisation de la RAM, du disque, du CPU, de la charge CPU (1 minute) et du swap via des requêtes PromQL.
La liste des capteurs mis à disposition est longue, vous pouvez les visualiser avec cette commande dans un navigateur:
http://192.168.0.160:9100/metrics
Facultatif: Créer une entité PING « binary_sensor.192_168_0_160 » permettant de vérifier si le PC Distant est conecté (conditionne l’affichage de la carte)

Étape 4 : Afficher les métriques dans Home Assistant
Pour visualiser les données, j’ai créé une carte personnalisée dans Home Assistant utilisant des composants comme custom:layout-card
, custom:mini-graph-card
, custom:bar-card
, et une carte Markdown. Cette carte affiche :
- Des graphiques pour l’utilisation de la RAM (48h) et du CPU (4h) avec des seuils de couleur.
- Des barres pour l’utilisation du disque et du swap, ainsi que la charge CPU.
- Un résumé textuel avec l’état du PC (en ligne/hors ligne), l’uptime, et les métriques clés.
Pour l’ajouter, installez les composants via HACS, accédez à votre tableau de bord, passez en mode YAML, et ajoutez la configuration de la carte (disponible dans mon précédent article ou sur mon blog). Redémarrez Home Assistant pour appliquer les changements.

type: custom:layout-card
layout_type: custom:vertical-layout
layout: {}
cards:
- name: PC BUREAU
styles:
card:
- text-transform: uppercase
- font-weight: bold
- font-size: 125%
- letter-spacing: 10px
style: |
ha-card {
border: solid 2px var(--primary-color);
}
type: custom:button-card
- type: entities
style: |
ha-card {
border: solid 2px var(--primary-color);
}
entities:
- type: custom:hui-vertical-stack-card
cards:
- type: horizontal-stack
cards:
- type: custom:mini-graph-card
name: RAM Usage
entities:
- sensor.pc_bureau_ram_utilisee_2
color_thresholds:
- value: 40
color: "#3498db"
- value: 50
color: "#f39c12"
- value: 60
color: "#E45E65"
show:
extrema: true
fill: true
hours_to_show: 48
points_per_hour: 1
line_width: 3
font_size: 80
height: 130
style: |
ha-card {
--ha-card-background: "rgba(0, 0, 0, 0.0)";
--ha-card-box-shadow: 'none';
border-radius: 5px;
}
- type: custom:mini-graph-card
name: CPU Usage
entities:
- sensor.pc_bureau_utilisation_cpu_2
color_thresholds:
- value: 0
color: "#3498db"
- value: 15
color: "#1db954"
- value: 28
color: "#e74c3c"
show:
extrema: true
icon: false
hours_to_show: 4
points_per_hour: 90
line_width: 2
font_size: 80
height: 130
style: |
ha-card {
--ha-card-background: "rgba(0, 0, 0, 0.0)";
--ha-card-box-shadow: 'none';
}
- type: horizontal-stack
cards:
- type: custom:bar-card
title_position: inside
name: Disque root (250 Go)
entities:
- entity: sensor.pc_bureau_disque_root_utilise_2
name: Disque Utilisé
max: 100
severity:
- from: 0
to: 25
color: Green
- from: 25.1
to: 50
color: Orange
- from: 50.1
to: 100
color: Red
align: split
columns: 1
decimal: 2
show_icon: true
stack: horizontal
unit_of_measurement: "%"
style: |
ha-card {
--ha-card-background: "rgba(0, 0, 0, 0.0)";
--ha-card-box-shadow: 'none';
}
- type: horizontal-stack
cards:
- type: custom:bar-card
title_position: inside
name: Infos système
entities:
- entity: sensor.pc_bureau_swap_utilisee_2
name: Swap
max: 100
severity:
- from: 0
to: 25
color: Green
- from: 25.1
to: 50
color: Orange
- from: 50.1
to: 100
color: Red
align: split
columns: 1
decimal: 2
show_icon: true
stack: horizontal
style: |
ha-card {
--ha-card-background: "rgba(0, 0, 0, 0.0)";
--ha-card-box-shadow: 'none';
}
- type: horizontal-stack
cards:
- type: custom:bar-card
title_position: inside
name: Infos système
entities:
- entity: sensor.pc_bureau_charge_cpu_1min_2
name: Ch 1mn
max: 30
severity:
- from: 0
to: 10
color: Green
- from: 10.1
to: 20
color: Orange
- from: 20.1
to: 30
color: Red
align: split
columns: 1
decimal: 2
show_icon: true
stack: horizontal
style: |
ha-card {
--ha-card-background: "rgba(0, 0, 0, 0.0)";
--ha-card-box-shadow: 'none';
}
- type: markdown
content: >
**État du PC Bureau**: {% if
is_state('binary_sensor.192_168_0_160', 'on') %} ✅ En ligne {%
else %} ❌ Hors ligne {% endif %}
**Uptime**: {{ states('sensor.pc_bureau_uptime_secondes') }} s
**Charge CPU 1 min**: {{
states('sensor.pc_bureau_charge_cpu_1min_2') }}
**RAM utilisée**: {{ states('sensor.pc_bureau_ram_utilisee_2') }}
%
**CPU utilisée**: {{ states('sensor.pc_bureau_utilisation_cpu_2')
}} %
**Disque utilisé**: {{
states('sensor.pc_bureau_disque_root_utilise_2') }} %
Dépannage
- Node Exporter inaccessible : Vérifiez que le port 9100 est ouvert et que le service
prometheus-node-exporter
est actif. - Données absentes dans Home Assistant : Testez les requêtes PromQL dans l’interface de Prometheus (
http://192.168.0.205:9090
). - Carte non affichée : Assurez-vous que les entités des capteurs correspondent à celles de la configuration et que les composants HACS sont installés.
Conclusion
Cette configuration permet de surveiller efficacement un PC distant avec Prometheus Node Exporter et d’afficher les métriques dans Home Assistant via une carte visuelle claire. Vous pouvez personnaliser les capteurs, les seuils de couleur, ou ajouter d’autres métriques selon vos besoins.
Cette solution facile à mettre en oeuvre est plus « légère » sur le pc distant que Glances.
Pour plus de détails sur la configuration de la carte, consultez mon blog ou partagez vos propres astuces en commentaire !