Tuto - management et surveillance de son NSPanel Pro via Jeedom

bonjour à tous,

EDIT du 31/07/2024 : Rajout de la gesiton de plusieurs NSPAnel pro sur un meme reseau (option -s sur toutes les commandes adb)

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

et créer un repertoire avec les droits www-data pour l’utilisation de adb via le plugin script

sudo mkdir /var/www/.android
sudo chown www-data.www-data /var/www/.android

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)
# version du 31/07/2024 10:00 - Rajout de la gestion de plusieurs NSPAnel Pro sur le reseau
# Version du 26/08/2024 12:00 - Correction des retour opur les charge 5min et 15min

# 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
}

# Déconnecter l'appareil via adb
disconnect_device() {
    adb disconnect $1:5555
}

# 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 -s $1:5555 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 -s $1:5555 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 -s $1:5555 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 -s $1:5555 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 up
check_uptime() {
    uptime_info=$(adb -s $1:5555 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 -s $1:5555 shell uptime | sed 's/,//g' | awk '{print $(NF-1)}')
    echo "$load_avg_5min"
}

# Obtenir la charge moyenne sur 15 minutes
get_load_avg_15min() {
    load_avg_15min=$(adb -s $1:5555 shell uptime | sed 's/,//g' | awk '{print $(NF)}')
    echo "$load_avg_15min"
}

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

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

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

check_screen_state() {
    screen_state=$(adb -s $1:5555 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

6 « 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 »

Pour info j’ai croisé un souci lors du lancement du serveur adb par l’utilisateur www-data. adb tente de créer un répertoire .android dans le dossier /var/www qui dans mon cas appartient à root sans droit d’écriture pour les autres. De ce fait adb sort en erreur.
J’ai changé le proprio de /var/www par www-data

t’as modifié des choses sur ton system ? www-data ne devrait pas eter un user avec un shell me sembe-t’il

Norbert

C’est bien le cas

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

Les process Apache tournent sous www-data (hormis le père). Lorsque tu lances le script contenant les commandes adb, il va forker adb sous le même compte pour lancer adb en mode daemon et assurer la connexion.

Je constate le même pb. je corrige dans le tutoriel. Merci du retour

1 « J'aime »

Salut.
J’ai dû modifier les commandes load average. Les colonnes précisées dans le awk ne correspondent pas au retour de la commande uptime

 17:37:04 up 3 days, 39 min,  0 users,  load average: 0.17, 0.19, 0.36

Le 5min est la colonne 11 et le 15min la colonne 12.

Autre sujet, le copier/coller du shell coupe 2 lignes, ce qui génère des erreurs.

Je confirme ! je vais corriger
Norbert

Corrigé dans le script initial

Idem

2 « J'aime »

Parfait tout ça perso je viens de commander le nouveau modèle nspanel pro 120, je pourrais tester.

1 « J'aime »

Intéressé pour un retour et des photos (et le prix) :wink:

1 « J'aime »

En ce moment sur itead tu l’as moitié prix soit 65 dollars … (200 modèles max)

1 « J'aime »