Sensor pour les MAJ debian

Bonjour,

Je souhaiterais créer une sensors qui me dise si il y a des MAJ de Debian à effectuer.

Par forcement tous les jour être obligé de me connecter en ssh pour faire une demande de maj qu’il n’y a probablement pas.


[center]## System Information

version core-2024.12.5
installation_type Home Assistant Supervised
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.13.0
os_name Linux
os_version 6.1.0-28-amd64
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 5000
Installed Version 2.0.1
Stage running
Available Repositories 1493
Downloaded Repositories 19
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Debian GNU/Linux 12 (bookworm)
update_channel stable
supervisor_version supervisor-2024.12.0
agent_version 1.6.0
docker_version 27.4.1
disk_total 455.5 GB
disk_used 8.4 GB
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized false
virtualization
supervisor_api ok
version_api ok
installed_addons Advanced SSH & Web Terminal (19.0.0), Studio Code Server (5.18.0), Mosquitto broker (6.4.1), Voltalis Bridge (1.4.1), FiatChamp (3.0.8), Linky (1.5.0)
Dashboards
dashboards 2
resources 12
views 6
mode storage
Recorder
oldest_recorder_run 27 décembre 2024 à 21:26
current_recorder_run 30 décembre 2024 à 15:36
estimated_db_size 19.53 MiB
database_engine sqlite
database_version 3.45.3
Sonoff
version 3.8.1 (ffa7e22)
cloud_online 7 / 10
local_online 1 / 1
[/center]

Salut,

La solution de base de Debian ne t’interrese pas?.

https://wiki.debian.org/UnattendedUpgrades

1 « J'aime »

Je voudrais juste un capteur sous HA qui me dise le nombre de MAJ qu’il y a effectuer.

Alors un script en python sur Debian qui fait un « apt update » et qui suivant la dernière ligne du retour envoie le nombre de mises à jour par MQTT…

alex@emqx:~# apt update            
Hit:1 http://deb.debian.org/debian bullseye InRelease
Get:2 http://security.debian.org bullseye-security InRelease [27.2 kB]                           
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]                          
Get:4 http://security.debian.org bullseye-security/main amd64 Packages [333 kB]                              
Get:5 http://security.debian.org bullseye-security/main Translation-en [216 kB]                                        
Get:6 https://packagecloud.io/emqx/emqx/debian bullseye InRelease [29.2 kB]                                                            
Get:7 https://packagecloud.io/emqx/emqx/debian bullseye/main amd64 Packages [12.1 kB]
Fetched 661 kB in 5s (121 kB/s)    
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
14 packages can be upgraded. Run 'apt list --upgradable' to see them.

Alors, ce serait génial. comment créer le sensor? #nweeb

Peuit-être que ça existe tout fait, mais c’est moi marrant que de demande à CHatGPT.
Voilà un script python à faire tourner tous les jours sur Debian.
Après suffit d’ajouter un sensor MQTT dans la config côté HA sur le topic « debian/updates » pour avoir cette info.

import subprocess
import paho.mqtt.client as mqtt

# Configuration MQTT
MQTT_BROKER = "mqtt_broker_adresse"  # Remplacez par l'adresse de votre broker MQTT
MQTT_PORT = 1883  # Port par défaut pour MQTT
MQTT_TOPIC = "debian/updates"
MQTT_USERNAME = "votre_utilisateur"  # Remplacez par votre utilisateur MQTT
MQTT_PASSWORD = "votre_mot_de_passe"  # Remplacez par votre mot de passe MQTT

# Fonction pour exécuter la commande apt update et récupérer le nombre de paquets
def get_update_count():
    try:
        # Exécuter la commande 'apt update'
        result = subprocess.run(['apt', 'update'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

        # Récupérer la sortie standard
        output = result.stdout

        # Diviser la sortie en lignes
        lines = output.splitlines()

        # Trouver la dernière ligne contenant "packages can be upgraded"
        for line in reversed(lines):
            if "packages can be upgraded" in line:
                # Extraire le premier mot (le nombre de paquets)
                return line.split()[0]
    except Exception as e:
        print(f"Erreur lors de l'exécution de 'apt update': {e}")
        return None

# Fonction pour envoyer le message via MQTT
def send_mqtt_message(message):
    try:
        client = mqtt.Client()

        # Configurer l'utilisateur et le mot de passe
        client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)

        # Connexion au broker MQTT
        client.connect(MQTT_BROKER, MQTT_PORT, 60)

        # Publier le message sur le topic
        client.publish(MQTT_TOPIC, message)
        client.disconnect()
        print(f"Message envoyé sur {MQTT_TOPIC}: {message}")
    except Exception as e:
        print(f"Erreur lors de l'envoi MQTT: {e}")

# Programme principal
if __name__ == "__main__":
    update_count = get_update_count()
    if update_count is not None:
        send_mqtt_message(update_count)
    else:
        print("Impossible de récupérer le nombre de paquets à mettre à jour.")

wahooo ca va commencer à devenir compliqué pour moi…

J’ai un truc un peu plus simple en « command_line ». L’un vérifie la version installée et l’autre celle dispo sur le net…

Pour info, je suis en docker et j’ai monter le /etc/debian_version dans mon container

command_line:

  - sensor:
      name: Current Debian version
      command: "curl -sSL http://cdn-fastly.deb.debian.org/debian/dists/stable/Release | grep Version | awk {'print $2'}"
      scan_interval : 86400

  - sensor:
      name: Installed Debian version
      command: "cat /etc/debian_version"
      scan_interval : 86400

Hésites pas si besoin.

je n’ai pas compris… Desolé je suis débutant malgré tout sur pas mal de choses mais j’essaie…

Apres plusieurs jours a essayer, j’ai pas réussi.

Qui pour m’aider? J’ai franchement pas réussi à faire ce que je souhaite

Bonjour,

J’utilisais un simple script bash pour envoyer une info. en MQTT.
Exemple pour envoyer une température de cpu:

#!/bin/bash

TEMP=$(/usr/bin/vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)

/usr/bin/mosquitto_pub -h mqttbrocker -t home/sys/${HOSTNAME}/cpu/temperature -m $TEMP

Il faudra installer le package paho-mqtt client pour avoir la commande mosquitto.

Et lancer la commande en crontab par exemple.

Pour HA, installer l’intégration MQTT et déclarer le sensor dans le yaml

J’ai bien le script python qui se connecte a MQTT. Mais je n’arrive pas creer le sensor dans sensor.yaml. j’ai tout plein d’erreurs

Dans configuration.yaml , j’ai ajouté cette ligne pour séparer mes entités MQTT:

mqtt: !include mqtt.yaml

Et je déclare les sensors MQTT dans le fichier mqtt.yaml comme celui-ci:

sensor:
  - name: "Température CPU"
    state_topic: home/sys/ariia/cpu/temperature
    unique_id: sys-ariia_cpu-temperature
    force_update: True
    device_class: temperature
    unit_of_measurement: °C
    expire_after: 600

Bien sur, faudra adapter le name, state_topic, device_class , expire_after et autres en fonction de ton besoin

J’ai oublié de préciser, il faut bien sur un brocker MQTT d’installer. En add-on ou autre

Alors, voilà ce que j’ai fait mais qui ne fonctionne pas.

#!/bin/bash

UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
UPDATES=$((UPDATES - 1))  # Ajuste pour exclure l'entête

/usr/bin/mosquitto_pub -h mqtt_broker_address -u "user" -P "password" -t home/sys/${HOSTNAME}/updates -m "$UPDATES"

et en sensor :

sensor:
  - platform: mqtt
    name: "Mises à jour Debian"
    state_topic: "home/acidburn/"
    unique_id: "update_check.sh"
    force_update: true
    device_class: update
    unit_of_measurement: "updates"
    expire_after: 600

Bonjour

Attention, plusieurs choses ne vont pas.

Le state_topic doit correspondre au nom du topic envoyé : home/sys/…
Le device_class doit être connu de HA, voir ici:

Et le unit_of_meaurement, idem il doit être connu de ha voir même lien ci-dessus, mais dans ce cas, il n’y en a pas besoin

Ne pas oublier de recharger la conf des entités MQTT après chaque modification et surtout regarder dans la log si des erreurs remontent

Voir aussi ici pour les sensors MQTT :

Pas assez calé encore pour y arriver :frowning:

Si vous savez utiliser une console linux, utiliser HA n’est pas plus compliqué,
Faut juste comprendre les principes de son fonctionnement au début et après ça roule tout seul.

Avec votre script lancé toutes les 2h par exemple:

#!/bin/bash
UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
UPDATES=$((UPDATES - 1))  # Ajuste pour exclure l'entête
/usr/bin/mosquitto_pub -h <mqtt_broker_address> -u "user" -P "password" -t home/sys/${HOSTNAME}/updates -m "$UPDATES"

Pour vérifier que le message est envoyé correctement, utiliser cette commande dans une autre console pour voir le message passé à chaque lancement du script:

$ mosquitto_sub -v -h <mqtt_broker_address> -t '#'

Voici un exemple de config. pour le sensor MQTT:
Dans le fichier mqtt.yaml:

sensor:
  - platform: mqtt
    name: "Mises à jour Debian"
    state_topic: "home/sys/<HOSTNAME>/updates"      # <HOSTNAME> à remplacer par le bon
    unique_id: "mise_a_jour_debian"
    force_update: true
    expire_after: 7500                              # > 2 heures (en secondes)

Vérifier que la conf. yaml est correct dans HA dans menu « Outils de développement »:

=> Vérifier la configuration

Si ok, recharger les entités MQTT sur la même page:

=> Entités MQTT configurées manuellement

Regarder dans menu Paramètres/Système/Journaux si il n’y a pas d’erreur concernant MQTT.

Si tout est bon, une nouvelle entité devrait etre visible dans Paramètres/Appareils et Services/Onglet entités en recherchant « debian » par exemple.

ben je suis mauvais. J’y arrive pas…