HttpremoteEvent - évolution prise en charge plusieurs payload pour un équipement

Hello @PiR ,
Je souhaiterais monitorer / notifier des infra (seedbox, etc …) et pour ce faire je voulais passer des webhook avec payload spécifique et c’est là qu’intervient ton plugin … :slight_smile:

A l’heure actuelle le plugin permet de créer des commandes.

Mise à part la première commande de l’équipement (id content) qui permet de la mettre à jour via un payload, les nouvelles commandes ne peuvent être MAJ qu’uniquement par la valorisation d’un attribut dans l’url

exemple

https://dnsJeedom/core/api/jeeApi.php?apikey=laClefApiJeedom&type=httpRemoteEvent&eqId=980&laCommande=laValeur

Il serait intéressant que pour chacune des commandes on puisse spécifier un payload … non ?

La seule alternative, ou alors j’ai un loupé, c’est de créer autant d’équipement que l’on a besoin de recevoir de payload différents.

A ta disposition pour donner des infos complémentaires.
Cordialement
@chris94440

je me réponds à moi même … :slight_smile:

En attendant un retour du dev j’ai fait la modification suivante dans le plugin … fichier httpRemoteEvent.class.php

Remplacer la fonction event() par

public static function event() {
     
		foreach (eqLogic::byType('httpRemoteEvent') as $eqLogic) {
			if($_REQUEST['eqId'] == $eqLogic->getId()){
              	$cmdNotUpdate=true;
				foreach ($eqLogic->getCmd() as $cmd) {
					$paramName = $cmd->getConfiguration('paramName') ? $cmd->getConfiguration('paramName') : 'param'.$cmd->getId();
                  	if (array_key_exists($paramName, $_REQUEST)) {
                      	log::add('httpRemoteEvent', 'debug', 'Param : ' . $paramName . ' exist');
                      	$content = $eqLogic->getCmd(null, 'content_'.$paramName);
                      	if (is_object($content)) {
                            $contentTxt = file_get_contents('php://input');
                            if($contentTxt != null){
                                log::add('httpRemoteEvent', 'debug', 'Set payload : ' . $contentTxt . ' for cmd ' . $content->getName() . ' and equipment id : ' . $_REQUEST['eqId']);
                                $content->setCollectDate('');
                                $content->event($contentTxt);
                              	$cmdNotUpdate=false;
                            } else {
                                $value = $_REQUEST[$paramName];
                                log::add('httpRemoteEvent', 'debug', 'Param : ' .$paramName);
                                log::add('httpRemoteEvent', 'debug', 'Value : ' .$value);
                                if(strlen($value)){
                                    log::add('httpRemoteEvent', 'debug', 'Set ' .$value . ' for cmd ' . $content->getName(). ' and equipment id : ' . $_REQUEST['eqId']);
                                    $content->setCollectDate('');
                                    $content->event($value);
									$cmdNotUpdate=false;
                                }
                            }
                        }
                    }                  	                 	                  	
				}
              
				if ($cmdNotUpdate) {
                  $contentTxt = file_get_contents('php://input');
                  if($contentTxt != null){
                      $content = $eqLogic->getCmd(null, 'content');
                      if (is_object($content)) {
                          log::add('httpRemoteEvent', 'debug', 'No specific cmd find but cmd content find -> set payload');
                          $content->setCollectDate('');
                          $content->event($contentTxt);
                      }
                  }
                }
			}
		}
		echo 'OK';
	}

Ajout de la fonction preSave() de la class httpRemoteEventCmd (tjs le même fichier)
Permet d’affecter le logical id avec la valeur content_commandeName … permettra à la fonction event de savoir à qui affecter le payload lors de la réception de l’event

  	public function preSave() {
      	if (is_object($this)) {
          	if (strlen($this->getLogicalId()) < 1) {
              //log::add('httpRemoteEvent', 'debug', '****cmd postSave **** - : ' . $this->getHumanName() . ' set eqlogic');
              $this->setLogicalId('content_'. $this->getName());
            }
        }
	}
  

Avec tout cela maintenant on peut executer une requête http depuis n’importe quel serveur et le payload pourra être interprété pour chacune des commandes de l’équipement… :slight_smile:

Exemple curl linux : cette commande valorisera la commande radarrde l’équipement 979

curl -i -X PUT -d "{\"geoloc\": {\"lat\": \"38.1899\", \"lon\": \"-76.5087\"}, \"longitude\": \"-76.5087\" }"  'https://dnsJeedom/core/api/jeeApi.php?apikey=UneClefApiJeedom&type=httpRemoteEvent&eqId=979&radarr'

A partir de là on peut faire ce qu’on veut …
Par exemple pour ceux qui ont une seedbox et utilisent des outils comme sonarr ou radarr … il est possible de paramétrer l’envoi d’un webhook lors d’un évènement sur un fichier (download start, stop, finish, etc …) … on obtient un résultat du style …

A voir dans le temps si pas de bug dans ce que j’ai fait

@chris94440