{"id":4029,"date":"2025-06-04T08:00:00","date_gmt":"2025-06-04T06:00:00","guid":{"rendered":"https:\/\/domo.rem81.com\/?p=4029"},"modified":"2025-06-05T07:22:30","modified_gmt":"2025-06-05T05:22:30","slug":"ha-surveiller-un-pc-distant-avec-prometheus-et-home-assistant","status":"publish","type":"post","link":"https:\/\/domo.rem81.com\/index.php\/2025\/06\/04\/ha-surveiller-un-pc-distant-avec-prometheus-et-home-assistant\/","title":{"rendered":"HA-Surveiller un PC distant avec Prometheus et Home Assistant"},"content":{"rendered":"\n\n\n\n<h1 class=\"wp-block-heading\">Intro<\/h1>\n\n\n\n<p>Dans cet article, je vous explique comment surveiller les m\u00e9triques d\u2019un PC distant sous Linux (CPU, RAM, disque, etc.) \u00e0 l\u2019aide de <strong>Prometheus Node Exporter<\/strong> et les afficher dans <strong>Home Assistant<\/strong> avec une carte visuelle. Ce tutoriel est bas\u00e9 sur ma configuration pour surveiller mon PC de bureau depuis un serveur Proxmox ex\u00e9cutant une instance LXC de Prometheus, int\u00e9gr\u00e9e \u00e0 Home Assistant.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Pr\u00e9requis<\/h1>\n\n\n\n<p>Avant de commencer, assurez-vous d\u2019avoir :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un PC distant sous Linux avec <strong>Prometheus Node Exporter<\/strong> install\u00e9.<\/li>\n\n\n\n<li>Une instance <strong>Prometheus<\/strong> configur\u00e9e (ici, une LXC sur Proxmox).<\/li>\n\n\n\n<li><strong>Home Assistant<\/strong> install\u00e9 et configur\u00e9.<\/li>\n\n\n\n<li>Les ports n\u00e9cessaires ouverts (9100 pour Node Exporter, 9090 pour Prometheus).<\/li>\n\n\n\n<li>Une connaissance de base des fichiers YAML et des requ\u00eates PromQL.<\/li>\n\n\n\n<li>Les composants personnalis\u00e9s <strong>HACS<\/strong> : <code>custom:layout-card<\/code>, <code>custom:mini-graph-card<\/code>, <code>custom:bar-card<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 1 : Configurer Prometheus Node Exporter<\/h2>\n\n\n\n<p>Sur le PC distant (IP <code>192.168.0.160<\/code>), installez <strong>Prometheus Node Exporter<\/strong> pour collecter les m\u00e9triques syst\u00e8me :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install prometheus-node-exporter\n<\/code><\/pre>\n\n\n\n<p>Activez et d\u00e9marrez le service :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable prometheus-node-exporter\nsudo systemctl start prometheus-node-exporter\n<\/code><\/pre>\n\n\n\n<p>Ouvrez le port 9100 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 9100\/tcp\n<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que Node Exporter fonctionne en acc\u00e9dant \u00e0 <code>http:\/\/192.168.0.160:9100\/metrics<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 2 : Configurer Prometheus<\/h2>\n\n\n\n<p>Sur le serveur Proxmox (IP <code>192.168.0.205<\/code>), configurez <strong>Prometheus<\/strong> pour collecter les donn\u00e9es du PC distant. Modifiez le fichier <code>\/etc\/prometheus\/prometheus.yml<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scrape_configs:\n  - job_name: 'pc_bureau'\n    static_configs:\n      - targets: &#091;'192.168.0.160:9100']\n<\/code><\/pre>\n\n\n\n<p>Red\u00e9marrez Prometheus :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart prometheus\n<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez la collecte des donn\u00e9es via l\u2019interface web de Prometheus : <code>http:\/\/192.168.0.205:9090<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 3 : Int\u00e9grer les m\u00e9triques dans Home Assistant<\/h2>\n\n\n\n<p>Ajoutez les capteurs suivants dans le fichier <code>configuration.yaml<\/code> de Home Assistant pour r\u00e9cup\u00e9rer les m\u00e9triques via l\u2019API de Prometheus :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sensor:\n  - platform: rest\n    name: PC Bureau - Uptime secondes\n    unique_id: pc_bureau_prometheus_uptime\n    resource: \"http:\/\/192.168.0.205:9090\/api\/v1\/query?query=node_time_seconds - node_boot_time_seconds\"\n    value_template: &gt;\n      {% set res = value_json.data.result %}\n      {% if res and res&#091;0].value %}\n        {{ res&#091;0].value&#091;1] | float | round(1) }}\n      {% else %}\n        0.0\n      {% endif %}\n    unit_of_measurement: 's'\n    scan_interval: 300\n\n  - platform: rest\n    name: PC Bureau - RAM utilis\u00e9e %\n    unique_id: pc_bureau_ram_util\n    resource: \"http:\/\/192.168.0.205:9090\/api\/v1\/query?query=(1 - (node_memory_MemAvailable_bytes \/ node_memory_MemTotal_bytes)) * 100\"\n    value_template: &gt;\n      {% set res = value_json.data.result %}\n      {% if res and res&#091;0].value %}\n        {{ res&#091;0].value&#091;1] | float | round(1) }}\n      {% else %}\n        0.0\n      {% endif %}\n    unit_of_measurement: '%'\n    scan_interval: 60\n\n  - platform: rest\n    name: PC Bureau - Disque Root utilis\u00e9 %\n    unique_id: pc_bureau_root_disk\n    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\"\n    value_template: &gt;\n      {% set res = value_json.data.result %}\n      {% if res and res&#091;0].value %}\n        {{ res&#091;0].value&#091;1] | float | round(1) }}\n      {% else %}\n        0.0\n      {% endif %}\n    unit_of_measurement: '%'\n    scan_interval: 600\n\n  - platform: rest\n    name: PC Bureau - Utilisation CPU %\n    unique_id: pc_bureau_cpu_util\n    resource: \"http:\/\/192.168.0.205:9090\/api\/v1\/query?query=100 - (avg by(instance)(rate(node_cpu_seconds_total{mode=\\\"idle\\\"}&#091;1m])) * 100)\"\n    value_template: &gt;\n      {% set res = value_json.data.result %}\n      {% if res and res&#091;0].value %}\n        {{ res&#091;0].value&#091;1] | float | round(1) }}\n      {% else %}\n        0.0\n      {% endif %}\n    unit_of_measurement: '%'\n    scan_interval: 60\n\n  - platform: rest\n    name: PC Bureau - Charge CPU 1min\n    unique_id: pc_bureau_load1\n    resource: \"http:\/\/192.168.0.205:9090\/api\/v1\/query?query=node_load1{job=\\\"pc_bureau\\\"}\"\n    value_template: &gt;\n      {% set res = value_json.data.result %}\n      {% if res and res&#091;0].value %}\n        {{ res&#091;0].value&#091;1] | float | round(1) }}\n      {% else %}\n        0.0\n      {% endif %}\n    unit_of_measurement: load\n    scan_interval: 60\n\n  - platform: rest\n    name: PC Bureau - Swap utilis\u00e9e %\n    unique_id: pc_bureau_swap_util\n    resource: \"http:\/\/192.168.0.205:9090\/api\/v1\/query?query=(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) \/ node_memory_SwapTotal_bytes * 100\"\n    value_template: &gt;\n      {% set res = value_json.data.result %}\n      {% if res and res&#091;0].value %}\n        {{ res&#091;0].value&#091;1] | float | round(1) }}\n      {% else %}\n        0.0\n      {% endif %}\n    unit_of_measurement: '%'\n    scan_interval: 60\n<\/code><\/pre>\n\n\n\n<p>Ces capteurs r\u00e9cup\u00e8rent l\u2019uptime, l\u2019utilisation de la RAM, du disque, du CPU, de la charge CPU (1 minute) et du swap via des requ\u00eates PromQL.<\/p>\n\n\n\n<p>La liste des capteurs mis \u00e0 disposition est longue, vous pouvez les visualiser avec cette commande dans un navigateur:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;192.168.0.160:9100\/metrics<\/code><\/pre>\n\n\n\n<p><strong>Facultatif: <\/strong>Cr\u00e9er une entit\u00e9 PING \u00ab\u00a0binary_sensor.192_168_0_160\u00a0\u00bb permettant de v\u00e9rifier si le PC Distant est conect\u00e9 (conditionne l&rsquo;affichage de la carte)<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"375\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-2-1024x375.png\" alt=\"\" class=\"wp-image-4031\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-2-1024x375.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-2-300x110.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-2-768x281.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-2.png 1460w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9tape 4 : Afficher les m\u00e9triques dans Home Assistant<\/h2>\n\n\n\n<p>Pour visualiser les donn\u00e9es, j\u2019ai cr\u00e9\u00e9 une carte personnalis\u00e9e dans Home Assistant utilisant des composants comme <code>custom:layout-card<\/code>, <code>custom:mini-graph-card<\/code>, <code>custom:bar-card<\/code>, et une carte Markdown. Cette carte affiche :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Des graphiques pour l\u2019utilisation de la RAM (48h) et du CPU (4h) avec des seuils de couleur.<\/li>\n\n\n\n<li>Des barres pour l\u2019utilisation du disque et du swap, ainsi que la charge CPU.<\/li>\n\n\n\n<li>Un r\u00e9sum\u00e9 textuel avec l\u2019\u00e9tat du PC (en ligne\/hors ligne), l\u2019uptime, et les m\u00e9triques cl\u00e9s.<\/li>\n<\/ul>\n\n\n\n<p>Pour l\u2019ajouter, installez les composants via HACS, acc\u00e9dez \u00e0 votre tableau de bord, passez en mode YAML, et ajoutez la configuration de la carte (disponible dans mon pr\u00e9c\u00e9dent article ou sur mon blog). Red\u00e9marrez Home Assistant pour appliquer les changements.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"313\" height=\"675\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-4.png\" alt=\"\" class=\"wp-image-4041\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-4.png 313w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/06\/image-4-139x300.png 139w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>type: custom:layout-card\nlayout_type: custom:vertical-layout\nlayout: {}\ncards:\n  - name: PC BUREAU\n    styles:\n      card:\n        - text-transform: uppercase\n        - font-weight: bold\n        - font-size: 125%\n        - letter-spacing: 10px\n    style: |\n      ha-card {\n        border: solid 2px var(--primary-color);\n      }\n    type: custom:button-card\n  - type: entities\n    style: |\n      ha-card {\n        border: solid 2px var(--primary-color);\n      }\n    entities:\n      - type: custom:hui-vertical-stack-card\n        cards:\n          - type: horizontal-stack\n            cards:\n              - type: custom:mini-graph-card\n                name: RAM Usage\n                entities:\n                  - sensor.pc_bureau_ram_utilisee_2\n                color_thresholds:\n                  - value: 40\n                    color: \"#3498db\"\n                  - value: 50\n                    color: \"#f39c12\"\n                  - value: 60\n                    color: \"#E45E65\"\n                show:\n                  extrema: true\n                  fill: true\n                hours_to_show: 48\n                points_per_hour: 1\n                line_width: 3\n                font_size: 80\n                height: 130\n                style: |\n                  ha-card { \n                    --ha-card-background: \"rgba(0, 0, 0, 0.0)\";\n                    --ha-card-box-shadow: 'none';\n                    border-radius: 5px;\n                  }\n              - type: custom:mini-graph-card\n                name: CPU Usage\n                entities:\n                  - sensor.pc_bureau_utilisation_cpu_2\n                color_thresholds:\n                  - value: 0\n                    color: \"#3498db\"\n                  - value: 15\n                    color: \"#1db954\"\n                  - value: 28\n                    color: \"#e74c3c\"\n                show:\n                  extrema: true\n                  icon: false\n                hours_to_show: 4\n                points_per_hour: 90\n                line_width: 2\n                font_size: 80\n                height: 130\n                style: |\n                  ha-card { \n                    --ha-card-background: \"rgba(0, 0, 0, 0.0)\";\n                    --ha-card-box-shadow: 'none';\n                  }\n          - type: horizontal-stack\n            cards:\n              - type: custom:bar-card\n                title_position: inside\n                name: Disque root (250\u202fGo)\n                entities:\n                  - entity: sensor.pc_bureau_disque_root_utilise_2\n                    name: Disque Utilis\u00e9\n                    max: 100\n                severity:\n                  - from: 0\n                    to: 25\n                    color: Green\n                  - from: 25.1\n                    to: 50\n                    color: Orange\n                  - from: 50.1\n                    to: 100\n                    color: Red\n                align: split\n                columns: 1\n                decimal: 2\n                show_icon: true\n                stack: horizontal\n                unit_of_measurement: \"%\"\n                style: |\n                  ha-card { \n                    --ha-card-background: \"rgba(0, 0, 0, 0.0)\";\n                    --ha-card-box-shadow: 'none';\n                  }\n          - type: horizontal-stack\n            cards:\n              - type: custom:bar-card\n                title_position: inside\n                name: Infos syst\u00e8me\n                entities:\n                  - entity: sensor.pc_bureau_swap_utilisee_2\n                    name: Swap\n                max: 100\n                severity:\n                  - from: 0\n                    to: 25\n                    color: Green\n                  - from: 25.1\n                    to: 50\n                    color: Orange\n                  - from: 50.1\n                    to: 100\n                    color: Red\n                align: split\n                columns: 1\n                decimal: 2\n                show_icon: true\n                stack: horizontal\n                style: |\n                  ha-card { \n                    --ha-card-background: \"rgba(0, 0, 0, 0.0)\";\n                    --ha-card-box-shadow: 'none';\n                  }\n          - type: horizontal-stack\n            cards:\n              - type: custom:bar-card\n                title_position: inside\n                name: Infos syst\u00e8me\n                entities:\n                  - entity: sensor.pc_bureau_charge_cpu_1min_2\n                    name: Ch 1mn\n                max: 30\n                severity:\n                  - from: 0\n                    to: 10\n                    color: Green\n                  - from: 10.1\n                    to: 20\n                    color: Orange\n                  - from: 20.1\n                    to: 30\n                    color: Red\n                align: split\n                columns: 1\n                decimal: 2\n                show_icon: true\n                stack: horizontal\n                style: |\n                  ha-card { \n                    --ha-card-background: \"rgba(0, 0, 0, 0.0)\";\n                    --ha-card-box-shadow: 'none';\n                  }\n          - type: markdown\n            content: >\n              **\u00c9tat du PC Bureau**:  {% if\n              is_state('binary_sensor.192_168_0_160', 'on') %} \u2705 En ligne {%\n              else %} \u274c Hors ligne {% endif %}\n\n              **Uptime**: {{ states('sensor.pc_bureau_uptime_secondes') }} s\n\n              **Charge CPU 1 min**: {{\n              states('sensor.pc_bureau_charge_cpu_1min_2') }}\n\n              **RAM utilis\u00e9e**: {{ states('sensor.pc_bureau_ram_utilisee_2') }}\n              %\n\n              **CPU utilis\u00e9e**: {{ states('sensor.pc_bureau_utilisation_cpu_2')\n              }} %\n\n              **Disque utilis\u00e9**: {{\n              states('sensor.pc_bureau_disque_root_utilise_2') }} %\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">D\u00e9pannage<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Node Exporter inaccessible<\/strong> : V\u00e9rifiez que le port 9100 est ouvert et que le service <code>prometheus-node-exporter<\/code> est actif.<\/li>\n\n\n\n<li><strong>Donn\u00e9es absentes dans Home Assistant<\/strong> : Testez les requ\u00eates PromQL dans l\u2019interface de Prometheus (<code>http:\/\/192.168.0.205:9090<\/code>).<\/li>\n\n\n\n<li><strong>Carte non affich\u00e9e<\/strong> : Assurez-vous que les entit\u00e9s des capteurs correspondent \u00e0 celles de la configuration et que les composants HACS sont install\u00e9s.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Cette configuration permet de surveiller efficacement un PC distant avec <strong>Prometheus Node Exporter<\/strong> et d\u2019afficher les m\u00e9triques dans <strong>Home Assistant<\/strong> via une carte visuelle claire. Vous pouvez personnaliser les capteurs, les seuils de couleur, ou ajouter d\u2019autres m\u00e9triques selon vos besoins.<\/p>\n\n\n\n<p>Cette solution facile \u00e0 mettre en oeuvre est plus \u00ab\u00a0l\u00e9g\u00e8re\u00a0\u00bb sur le pc distant que Glances.<\/p>\n\n\n\n<p> Pour plus de d\u00e9tails sur la configuration de la carte, consultez mon blog ou partagez vos propres astuces en commentaire !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro Dans cet article, je vous explique comment surveiller les m\u00e9triques d\u2019un PC distant sous Linux (CPU, RAM, disque, etc.) \u00e0 l\u2019aide de Prometheus Node Exporter et les afficher dans &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-4029","post","type-post","status-publish","format-standard","hentry","category-homeassistant"],"_links":{"self":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/4029","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/comments?post=4029"}],"version-history":[{"count":7,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/4029\/revisions"}],"predecessor-version":[{"id":4042,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/4029\/revisions\/4042"}],"wp:attachment":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media?parent=4029"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/categories?post=4029"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/tags?post=4029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}