Tuto - management et surveillance de son NSPanel Pro via Jeedom

bonjour à tous,

Je vous partage ma dernière réalisation (100% du script shell via chatGPT, oui, oui !!!) pour manager mes NSPanel PRO …
On commence par le résultat :

image

Ce qui est surveiller :

  • Si il est online (ping)
  • Si il est attaché à Jeedom (adb connect), necessaire pour le manager
  • Si le process JC est present
  • l’uptime
  • le CPU
  • la mémoire
  • le stockage
  • la charge 5min et la charge 15min
  • allumer/eteint l’ecran et remonte l’état de l’ecran
  • simuler un appui sur le bouton home

On peut ensuite imaginer plein d’autres choses (quasi tous les elements systeme via les commandes adb shell)

pour réaliser ceci, très simple … le plugin script, 1 seul script, 1 seul équipement

1 - installer le package android-tools-adb

sudo apt update && sudo apt install android-tools-adb

tout le reste si passe sur Jeedom dans le plugin-script (je suppose donc que vous l’avez installé

2 - créer 1 équipement pour chaque NSPanel Pro

3 - integrer le script
Créer 1 commande de type info, puis creer un script (je l’ai appelé NSPanel_adb_tools.sh, le .sh à la fin est indispensable).
Editer ce script et copier le code ci-après dedans :

Détail script
#!/bin/bash
# Release notes
# Version initiale du 02/08/2023 10:00
# Version du 02/08/2023 10:00 - Rajout des commandes suivantes (screen_toggle, sleep, wakeup, screen)

# Vérifier si adb est installé sur le système
adb_path=$(which adb)
if [ -z "$adb_path" ]; then
    echo "adb non installé - sudo apt install android-tools-adb" 
    exit 2
fi

# Vérifier si l'adresse IP est passée en paramètre
if [ $# -lt 1 ]; then
    echo "Pas d'adresse IP passée en paramètre" 
    exit 3
fi

check_online_status() {
    ping -c1 -q $1 1>/dev/null 2>&1
    if [ $? -eq "0" ]; then
        echo "1"
    else
        echo "0"
    fi
}
    

# Connecter l'appareil via adb
connect_device() {
    adb connect $1:5555
    sleep 5
    adb_devices=$(adb devices | grep "$1:5555" | awk '{print $1}')
    if [ -z "$adb_devices" ]; then
        exit 99
    fi
}

# Vérifier si l'appareil est déjà connecté via adb
check_attached_status() {
    adb_devices=$(adb devices | grep "$1:5555" | awk '{print $1}')
    if [ -n "$adb_devices" ]; then
        echo "1"
    else
        echo "0"
    fi
}

# Redémarrer l'appareil via adb
reboot_device() {
    adb_devices=$(adb devices | grep "$1:5555" | awk '{print $1}')
    if [ -n "$adb_devices" ]; then
        adb -s $1:5555 reboot
        sleep 5
        get_reboot_timestamp $1
    else
        exit 99
    fi
}

# Obtenir le timestamp du dernier reboot de l'appareil
get_reboot_timestamp() {
    reboot_timestamp=$(adb -s $1:5555 shell date +%s)
    echo "$reboot_timestamp"
}

# Vérifier si le processus en paramètre est en cours d'exécution
check_process() {
    process_list=$(adb shell ps | grep $2)
    if [ -n "$process_list" ]; then
        echo "1"
    else
        echo "0"
    fi
}

# Vérifier l'utilisation de la mémoire RAM de l'appareil en pourcentage
check_ram_usage() {
    ram_info=$(adb shell cat /proc/meminfo | grep "MemTotal\|MemFree")
    total_ram=$(echo "$ram_info" | awk 'NR==1{print $2}')
    free_ram=$(echo "$ram_info" | awk 'NR==2{print $2}')
    used_ram=$(expr $total_ram - $free_ram)
    ram_percentage=$(expr $used_ram \* 100 / $total_ram)
    echo "$ram_percentage"
}

# Vérifier l'utilisation du stockage de l'appareil en pourcentage
check_storage_usage() {
    storage_info=$(adb shell df /data | grep "/data")
    total_storage=$(echo "$storage_info" | awk '{print $2}')
    used_storage=$(echo "$storage_info" | awk '{print $3}')
    storage_percentage=$(expr $used_storage \* 100 / $total_storage)
    echo "$storage_percentage"
}

# Vérifier l'utilisation du processeur (CPU) de l'appareil en pourcentage
check_cpu_usage() {
    cpu_info=$(adb shell dumpsys cpuinfo | grep TOTAL)
    cpu_usage=$(echo "$cpu_info" | awk '{print $1}')
    echo "$cpu_usage"
}

# Vérifier l'uptime de l'appareil au format renvoyé par la commande adb shell uptime
check_uptime() {
    uptime_info=$(adb shell uptime | awk -F 'up' '{print $2}' | awk -F ',' '{print $1}')
    echo "$uptime_info"
}

# Obtenir la charge moyenne sur 5 minutes
get_load_avg_5min() {
    load_avg_5min=$(adb shell uptime | awk '{print $9}')
    echo "$load_avg_5min"
}

# Obtenir la charge moyenne sur 15 minutes
get_load_avg_15min() {
    load_avg_15min=$(adb shell uptime | awk '{print $10}')
    echo "$load_avg_15min"
}

# Allume/eteint l'ecran
device_screen_toggle() {
    screen=$(adb -s $1:5555 shell input keyevent KEYCODE_POWER)
    echo "$screen"
}

# mettre le device en sleep
device_sleep() {
    screen=$(adb -s $1:5555 shell input keyevent KEYCODE_SLEEP)
    echo "$screen"
}

# reveiller le device
device_wakeup() {
    screen=$(adb -s $1:5555 shell input keyevent KEYCODE_WAKEUP)
    echo "$screen"
}

check_screen_state() {
    screen_state=$(adb shell dumpsys display | grep "mScreenState=ON")
    if [ -n "$screen_state" ]; then
        echo "1"
    else
        echo "0"
    fi
}
# Home
home() {
    home=$(adb -s $1:5555 shell input keyevent KEYCODE_HOME | grep "ON")
    echo "$home"
}

# Vérifier si l'appareil est déjà attaché
is_connected=$(check_attached_status $1)

if [ "$is_connected" -eq 0 ]; then
    connect_device $1
fi

# Exécuter l'action spécifiée par l'utilisateur
case "$2" in
    "online")
        check_online_status $1
        ;;
    "attached")
        check_attached_status $1
        ;;
    "reboot")
        reboot_device $1
        ;;
    "check_process")
        check_process $1 $3
        ;;
    "check_cpu")
        check_cpu_usage $1
        ;;
    "check_ram")
        check_ram_usage $1
        ;;
    "check_storage")
        check_storage_usage $1
        ;;
    "uptime")
        check_uptime $1
        ;;
    "load_avg_5min")
        get_load_avg_5min $1
        ;;
    "load_avg_15min")
        get_load_avg_15min $1
        ;;
    "screen_toggle")
        device_screen_toggle $1
        ;;
    "sleep")
        device_sleep $1
        ;;
    "wakeup")
        device_wakeup $1
        ;;
    "screen")
        check_screen_state $1
        ;;
    "home")
        home $1
        ;;
    *)
        check_online_status $1
        ;;
esac

Voilà, le plus dur est fait :wink:

4 - créer toutes les commande nécessaires
avec pour le script le format suivant :

/var/www/html/plugins/script/data/NSPanel_adb_tools.sh <adresse IP> <option>

De mon coté, je recupere l’adresse IP via le plugin scan.IP, ce qui donne :

/var/www/html/plugins/script/data/NSPanel_adb_tools.sh #[Periphériques][Scan.IP NSPanel Entrée][IpV4]# load_avg_5min

les commandes foncitons possibles sont les suivantes :

les options possibles sont les suivantes (et les commandes associées à créer :

  • online - commande info binaire non historisée
  • attached - commande info binaire non historisée
  • reboot - commande action
  • check_process - commande info binaire non historisée - mettre le nom du process en parametre 3 (com.jeedomconnect.app pour JC)
  • check_cpu - commande info numérique 0-100 % historisée
  • check_ram - commande info numérique 0-100 % historisée
  • check_storage - commande info numérique 0-100 % historisée
  • uptime - commande info autre non historisée
  • load_avg_5min - commande info numérique historisée
  • load_avg_15min - commande info numérique historisée
  • screen_toggle - commande action - allume/eteint l’ecran (equivalent sleep/wakeup)
  • sleep - commande action - passe le device en mode sleep
  • wakeup - commande action - réveille le device
  • screen - commande info binaire non historisée - affiche l’état de l’ecran
  • home - commande action - simule un appui sur le bouton home

ensuite, reste à planifier le rafraichissement automatique avec une auto-actualisation toutes les 5mins chez moi et et un « Délai avant d’actualiser les infos suite à une action » (reboot) à 60s.

N’hésitez pas à compléter le script et fournir vos modifications
Bonne implémentation

Norbert

3 « J'aime »

Salut, super boulot, merci beaucoup pour ton travail.

Du coup je me suis rajouter :

  • Une fonction pour simuler un appuie sur le bouton power pour allumer ou éteindre l’écran
# Allume/eteint l'ecran
device_screen() {
    screen=$(adb -s $1:5555 shell input keyevent KEYCODE_POWER)
    echo "$screen"
}
  • Une fonction pour simuler un appuie sur le bouton home
# Home
home() {
    home=$(adb -s $1:5555 shell input keyevent KEYCODE_HOME)
    echo "$home"
}

Par contre j’essai de faire une commande pour lancer une application, si je fait la commande à partir du shell de jeedom avec:

adb -s mon_adresse_ip:5555 shell monkey -p com.jeedomconnect.app 1

Cela passe sans problème, par contre quand j’essai de l’intégrer à ton script, cela ne semble pas passer. Aurais tu essayé de rajouter un bouton pour lancer JeedomConnect sur le NSPanel?

Bonne soirée,

Mathieu

grand merci pour ces propositions, j’ai mis à jour le post initial pour les integrer + quelques rajouts en suivant tes idées :

  • screen_toggle - commande action - allume/eteint l’ecran alternativement (equivalent sleep/wakeup)
  • sleep - commande action - passe le device en mode sleep
  • wakeup - commande action - réveille le device
  • screen - commande info binaire non historisée - affiche l’état de l’ecran
  • home - commande action - simule un appui sur le bouton home

L’idée d’allumer l’ecran (wakeup) à l’arrivée dans une pièce est assez séduisante en fonction de détecteurs de presence ou d’ouverture !

Aucune idée, j’ai paramétré JC comme launcher, donc je n’ai pas besoin de le lancer

Pas de soucis, je vais voir, moi je jongle entre JC (pour moi) et Sonos (pour ma femme).

Bonne journée,

Mathieu

pourquoi tu ne mets pas JC en launcher et un widget lanceur d’app SONOS sur la page d’accueil ?

Norbert

effectivement c’est une possibilité. je vais voir ce qu’il me faut vraiment :slight_smile: .

Par contre j’ai fait une autre modification, j’ai remplacé ta partie check_jeedomconnect_process par :

# Vérifier si le processus en paramètre est en cours d'exécution
check_process() {
    process_list=$(adb shell ps | grep $2)
    if [ -n "$process_list" ]; then
        echo "1"
    else
        echo "0"
    fi
}

et le lancement par

    "check_process")
        check_process $1 $3
        ;;

Du coup dans ma vérification de process je peux vérifier ce que je veux en passant le nom en paramètre.
Par exemple pour Jeedomconnect on aura comme lancement:

/var/www/html/plugins/script/data/NSPanel_ADB_Tools.sh IP_du_Panel check_process "com.jeedomconnect.app"

et pour Sonos par exemple:

/var/www/html/plugins/script/data/NSPanel_ADB_Tools.sh IP_du_Panel check_process "com.sonos.acr2"

Mathieu

C’est integré

Norbert

bonjour,
super boulot ca marche nikel.
J’ai installer jeedomconnect et il se lance automatiquement au démarrage.
serait il possible de créer une commande qui permettrait de l’arrêter pour accèder au setup par exemple ?
Merci

Je me réponds… j’ai intégré à ton script, le code ci-dessous ça ouvre le Laucher

# Setup
device_laucher() {
	laucher=$(adb -s $1:5555 shell monkey -p l.l 1)
    echo ""
    "laucher")
    	device_laucher $1
        ;;

et j’ai ajouté une action Laucher

/var/www/html/plugins/script/data/NSPanel_adb_tools.sh IP_du_Panel laucher

Gilles

1 « J'aime »