HA-Surveiller un PC distant avec Prometheus et Home Assistant

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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *