Upscmd depuis le plugin Onduleur (NUT)

Bonjour à tous,

[Contexte]

j'ai fait l'acquisition récemment d'un onduleur Eaton d'occasion que j'ai installé et allumé ce week-end (S36). Pour l'instant, il n'alimente rien, je préfère m'amuser avec mes tests sans risquer mes appareils électroniques.

Depuis mardi après-midi, une fois que j’ai reçu mon câble USB->RJ45(RS232) pour reset la carte réseau de l’onduleur (le mot de passe étant inconnu et paramétré par l’ancien propriétaire), j’épluche la documentation de NUT et essaye de jouer avec les possibilités que peut m’offre l’outil avec cet onduleur. Après quelques essais l’UPS est bien connecté via le réseau à un serveur NUT installé dans un container LXC sur Proxmox, j’arrive bien à récupérer les infos de l’onduleur.
J’ai installé hier soir le plugin Onduleur (NUT) de Jeedom pour remonter les informations du NUT Server vers Jeedom. J’arrive bien depuis hier soir à remonter les infos sur mon dashboard.

Mais voilà, cet après-midi je me suis replongé dans la documentation de NUT pour comprendre et mettre en œuvre la fonction upscmd. Cette fonction permet d’exécuter des actions directement sur l’UPS du style : éteindre une prise, allumé une prise, éteindre l’UPS, activer/désactiver/mute l’alarme sonore;
Et c’est cette dernière fonction qui m’intéresse.

[Observations]

  • Je n’ai apriori pas la possibilité d’effectuer cette commande directement depuis le plugin Onduleur (NUT) (je n’ai pas réussi);
  • Je crois que je peux réaliser la fonction depuis un scénario en me connectant en ssh (je ne préfère pas);

[Demande]

J’aimerai pouvoir depuis mon dashboard mute l’alarme sonore avec upscmd pour faire comme un acquittement du défaut « x/y » qui a déclenché cette alarme sonore. Est-ce que vous savez comment je peux réaliser cette commande upscmd directement depuis le plugin Onduleur (NUT) ?

[Idées]

Mon idée serait de bidouiller dans les commandes « Action » du plugin pour réaliser ce bouton, puisque le plugin a déjà toutes les infos utiles pour cette fonction (Utilisateur, MDP, IPNUTServer, DeviceID).
Il faudrait, je pense, uniquement changer la query générée par le plugin pour récupérer les infos, qui doit être du style:

  • upsc DeviceID@IPNUTServer <variable récupérée>

par:

  • upscmd -u Utilisateur -p MDP -w DeviceID@IPNUTServer <commande à exécuter>

Je peux fournir des informations complémentaires pour aider à la compréhension de mon besoin.

Merci à ceux qui m’accorderont un peu de leur temps et de leurs savoirs.

Bonjour,
Dans le plugin, j’ai déjà ajouté des commandes pour avoir des variables complémentaires, de base, le plugin ne remonte pas grand chose et j’avais un onduleur qui remontait beaucoup d’infos.
Par contre, je n’ai jamais testé des commandes à envoyer et suis pas assez calé pour le faire.
Par contre, je suis preneur de la solution éventuelle :grin:

Bonjour,

Si on lit la doc, le plugin ne traite que les informations reçues et n’est à priori pas fait pour en envoyer.

Seule solution alors, passer par le plugin script

Merci pour vos réponses @MaGoo et @lperenna.

Effectivement, la documentation ne fait pas allusion à ce que l’on peut envoyer vers le serveur, mais uniquement à ce que l’on peut recevoir. La possibilité de rajouter des variables complémentaires d’écoute fonctionne plutôt bien, j’ai pu rajouter la température de l’UPS.

Savez-vous s’il est possible de proposer des améliorations à un plugin officiel Jeedom SAS ?

Pour l’instant, je vais essayer, comme proposé, de faire un script en php qui récupéra les données d’identifications présent dans le plugin Onduleur (NUT). Celui-ci s’en servira pour exécuter une commande shell upscmd (ou je me servirai d’un programme python avec le module nut3 comme ce qui semble est réalisé par le plugin officiel), avec pour action/commande une variable donnée à l’appelle du script.
Ensuite, je lierai ce script à un une action du plugin Onduleur (NUT).

Je vous partagerai mon code et comment le reproduire chez vous (si celui-ci marche !).
On pourra peut être également corriger des males façons de mon code :slight_smile:

je pense que c’est le plus simple

1 « J'aime »

@lperenna et @MaGoo

J’ai réussi à obtenir quelque chose.

Je peux depuis un script php, qui prend comme argument le DeviceIDNUT et la commande à effectuer, exécuter cette commande upscmd.
Je n’arrive cependant pas à:

  • Lier le script action à une commande action dans le plugin Onduleur (NUT).
  • Rafraichir le widget de l’ups du dashboard avec la fonction php ci-dessous pour voir immédiatement le changement d’état.
cmd::byId($refresh_id)->execCmd();

mon code php:

#!/usr/bin/env php

<?php
// Ce code PHP permet d'envoyer une commande instantanée "upscmd" à un serveur NUT.

// Inclusion du core de Jeedom pour exploiter ses classes PHP.
require_once "/var/www/html/core/php/core.inc.php";

// Pour rappel, la commande à exécuter en tant que client NUT Server pour upscmd est :
// upscmd -u <User> -p <Password> <NUTDeviceID>@<AdresseNUTServer> <ups_command>

// Pour connaître les commandes possibles selon votre UPS, exécutez dans le shell : 
// upscmd -l <NUTDeviceID>@<AdresseNUTServer>

// Ce script récupère la configuration de l'objet créé dans le plugin "Onduleur (NUT)", 
// à savoir User, Password, NUTDeviceID, AdresseNUTServer.

// Les variables sont transmises lors de l'appel du script PHP.
// Les deux arguments sont :
//  - $argv[1] : LogicalId (NUTDeviceID) de l'objet créé depuis le plugin "Onduleur (NUT)".
//  - $argv[2] : ups_command (la commande à exécuter par le serveur NUT sur l'UPS).

// Récupération des paramètres transmis
$nutLogicalId = $argv[1];
$ups_command = $argv[2];

// Utilisation des classes Jeedom pour récupérer les informations nécessaires à l'exécution de la commande upscmd
$objectNutConfiguration = nut::byLogicalId($nutLogicalId, "nut")->getConfiguration();
$address_nut = $objectNutConfiguration['adresse_nut'];  // Adresse IP du serveur NUT
$username = $objectNutConfiguration['username'];        // Nom d'utilisateur pour NUT
$password = $objectNutConfiguration['password'];        // Mot de passe pour NUT

// Exécution de la commande upscmd avec les informations récupérées
$response = shell_exec("upscmd -u $username -p $password $nutLogicalId@$address_nut $ups_command");

// Affichage de la réponse du serveur NUT
echo $response;

// Mise à jour des données de l'UPS après l'exécution de la commande

// Récupération de l'ID de la commande "refresh" pour l'UPS
$refresh_id = nut::byLogicalId($nutLogicalId, "nut")->getCmd('Action', 'refresh')->getId();

// Affichage de l'ID de la commande "refresh"
echo $refresh_id;

// Exécution de la commande de rafraîchissement
cmd::byId($refresh_id)->execCmd();

?>

Dans le plugin script, créer une action par commande en donnant l’accès à mon_script.php, il me semble qu’il est préférable de ranger les scripts dans le dossier /var/www/html/plugins/script/data/. On passera les deux arguments nécessaires le : ID de l’ups et la commande à effectuer : beeper.enable

/var/www/html/plugins/script/data/mon_script.php Eaton beeper.enable

Et normalement, c’est tout bon!
Pour ne pas avoir de surprise, il est préférable de vérifier les commandes utilisées par votre UPS en exécutant la commande suivante dans un shell:

upscmd -l <NUTDeviceID>@<AdresseNUTServer>
exemple: 
upscmd -l Eaton@192.168.1.56

Vérifier également que vous avez les droits utilisateurs NUT appropriés → voir documentation NUT.

Comme explicité plus haut, il me manque:

  • le refresh du widget de l’ups dans la foulée de l’exécution de la commande pour voir immédiatement le changement d’état;
  • le faite que je ne peux pas réutiliser des boutons du plugin Onduleur (NUT), et donc être obligé d’avoir un autre bouton indépendant du widget sur le dashboard ou bien être dans l’obligation de passer par un plugin virtuel.

N’hésitez pas à corriger mon code, je ne suis pas programmeur. Toutes remarques sont les bienvenues.

1 « J'aime »