Tuto - suivre et gérer ses livraisons via JeedomConnect

Un nouveau petit tuto pour agrémenter votre plugin-jeedomconnect d’une fonctionnalité de suivi des colis.
Il utilise coté Jeedom le plugin plugin-suivreuncolis. Ce dernier doit donc etre fonctionnel avant de commencer ce tuto !
Ce que nous allons voir et faire à partir de JC:
1 - Dans un menu JC (haut ou bas) afficher le suivi des colis (nom du colis, statut du colis)
2 - Supprimer via JC les colis livrés
3 - Modifier un colis existant pour mettre à jour le numéro de suivi (que nous n’avons pas en principe lors de l’achat) et le transporteur
4 - Ajouter complètement un colis à suivre (nom/commentaire/numéro de suivi/transporteur)
!! les champs complémentaires nécessaire au suivi Aftership ne sont pas traiter !!

Ce tuto est prévu pour le suivi de 6 colis maximum mais vous pouvez en mettre plus ou moins que ca.

Quelques copies d’écran pour vous faire saliver …
l’écran général - ajout d’un colis et suivi de la livraison de tous les colis


l’écran détail d’un colis - modification du numéro de suivi et du transpoteur

l’écran d’ajout d’un colis

les icones utilisés …
icones colis.zip.txt (1,3 Mo)
image

… PASSONS AUX CHOSES SERIEUSES
Le principe :

  • on crée des virtuels (1 par colis suivi) qui feront le lien entre plugin-jeedomconnect et plugin-suivreuncolis
  • on crée les widget sur le plugin-jeedomconnect qui se basent sur les virtuels créés (!! pour 6 colis suivis, 24 widgets sont nécessaires, 1 pour le suivi, 1 pour le chgt de numéro de suivi, 1 pour le changement de transporteur, un pour la suppression d’un colis)
  • on crée les virtuels pour l’ajout d’un colis
  • on met en place les scenarios avec les blocs code necessaires pour agrementer tout ca

1 - CREER LES VIRTUELS NECESSAIRES pour faire le lien entre les equipements du plugin-suivreuncolis, les widgets de plugin-jeedomconnect et les scenarios nécessaires.

- virtuel pour la création d’un nouveau colis avec les commandes suivantes :

Nom de l'équipement : Nouveau Colis
Commandes :
- Nom  (type info / Autre)
- Numéro suivi  (type info / Autre)
- Commentaire  (type info / Autre)
- Transporteur (type action/liste) et la commande info associée Transporteur (valeur)
(données de la liste : aftership|AfterShip;laposte|La Poste;sky56|Sky56;aliexpress|AliExpress Shipping;UPS|UPS)

- 6 virtuels pour la gestion de chacun des colis :

Nom de l'équipement : Colis 1
Commandes :
- Nom  (type info / Autre)
- Etat (type info / Autre)
- Horodatage (type info / Autre)
- Code suivi  (type info / Autre)
- Transporteur (type action/liste) et la commande info associée Transporteur (valeur)
- Suppression suivi colis  (type action/binaire) et la commande info associée Suppression suivi colis (valeur)

Bien faire attention à la saisie du premier virtuel et dupliquer ce dernier 5 fois

Voilà ce que l’on doit obtenir :

2 - CREER LES WIDGET SUR LE PLUGIN JC POUR L’AFFICHAGE DU SUIVI
il convient de créer 6 series (1 pour chacun des colis) de 4 widgets :
!! soyez méthodique pour eviter de perdre trop de temps !!
Créer vos widget pour le colis 1, tester et lorsque c’est OK, dupliquer …

1 widget de type évènement pour la mise à jour du numéro de suivi x6

1 widget de type liste de choix pour la mise à jour du transporteur x6

1 widget de type générique actionpour la suppression du colis une fois la livraison effectuée x6

1 widget de type générique texte pour le l’affichage du suivi x6

Vous pouvez aussi utiliser la vue d’ensemble du plugin pour vous assurer que tous vos widgets ont la même config

3 - CREER LES WIDGET SUR LE PLUGIN JC POUR L’AFFICHAGE DU SUIVI
image
ils prennent en champ statut les virtuels precedement créés dans l’équipement virtuel « nouveau colis »

un widget pour le champ commentaire

Nom : Nouveau colis - Commentaire
type : Evenement

un widget pour le champ Nom

Nom : Nouveau colis - Nom
type : Evenement

un widget pour le champ numéro de suivi

Nom : Nouveau colis - Numéro Suivi
type : Evenement

un widget pour le champ transporteur
!! widget de type liste de choix et pas évènement !!

Nom : Nouveau colis - Transporteur
type : liste de choix

Nous créerons ensuite un autre widget scenario … mais il faut d’abord créer le scenario :wink:

4 - REGLER L’AFFICHAGE DES WIDGET SUR JC
intégrez les widgets suivi colis x et sup colis x dans un menu (haut ou bas) de JC, et via les grilles personnalisées, adaptez l’affichage.
vous pouvez-vous inspirer de ce que j’ai fait ou laisser faire votre imagination (cf au début du poste)
pour ma part, j’affiche le widget suivi colis en mode carte (à personnaliser pour masquer le statut) et le widget sup colis en mode Widget (seule l’image n’est pas cachée)
Faites attention à bien mettre le suivi du colis 1 et le widget sup du colis 1 en face l"un de l’autre !!!

5 - CREER LES SCENARIOS
4 scenarios sont à créer :

  • Suivi Colis - Ajout colis ==> pour ajouter un colis
  • Suivi Colis - MAJ colis ==> pour mettre à jour le numéro de suivi ou le transporteur
  • Suivi Colis - Résumé ==> pour afficher les colis dans l’app JC
  • Suivi Colis - Suppression colis ==> pour supprimer un colis

Scenario ajout colis
Aucun déclencheur (sera lancé par le widget scenario à créer plus tard)
bloc code : si vous avez utilisé les mêmes noms de virtuel que moi, seule la première ligne $eqNewColis est à changer pour mettre le nom de l’équipement virtuel correspondant

require_once dirname(__FILE__) . '/../../plugins/JeedomConnect/core/class/JeedomConnectWidget.class.php';

// Virtuel new colis
$eqNewColis = '[Colis][Nouveau Colis]';

// recupération des données du colis 
$nomNewColis=cmd::byString('#'.$eqNewColis.'[Nom]#')->execCmd() ;
$numSuiviNewColis=cmd::byString('#'.$eqNewColis.'[Numéro suivi]#')->execCmd() ;
$comNewColis=cmd::byString('#'.$eqNewColis.'[Commentaire]#')->execCmd() ;
$transporteurNewColis=cmd::byString('#'.$eqNewColis.'[Transporteur (valeur)]#')->execCmd() ;

// création de l'equipement
$colis = new Suivreuncolis();
$colis->setName($nomNewColis);
$colis->setEqType_name('Suivreuncolis');
$colis->setObject_id(1);
$colis->setIsEnable(1);
$colis->setIsVisible(1);

$colis->setConfiguration('numsuivi',$numSuiviNewColis);
$colis->setConfiguration('commentaire',$comNewColis);
$colis->setConfiguration('transporteur',$transporteurNewColis);
//$colis->setConfiguration('transaftership','mondialrelay');
//$colis->setConfiguration('cp_aftership','ACP');

$colis->save();

$scenario->setLog('Id new eq : ' . $colis->getId());

J’ai rajouté en toute fin de ce scenario une action de lancement du scenario de mise à jour du résumé (que l’on crée tout de suite après) pour afficher ce nouveau colis dans JC :

Suivi Colis - Résumé
déclencheur : programmé (j’ai mis toutes les heures !)
(si quelqu’un a une piste pour un autre declencheur provoqué à la mise à jour des infos d’un colis ou la création d’un nouveau colis, je suis preneur :wink:)
Ce scenario est à adapter en fonction de votre paramétrage
→ ligne 13 : renseigner le nom des équipements virtuels que vous avez créés pour chaque colis
chez mois, c’est [colis][colis 1], [colis][colis 2], … donc j’ai mis #[Colis][Colis ‹ .$i. ›]
$i étant incrementé, le # au début est à conserver !!!

→ lignes 44 à 114, il convient de renseigner les widgetId des équipements « colis suivi xx » et « supp colis xx »
image
A faire pour les 6 colis. la premiere serie correspond à l’affichage d’un colis
La seconde série correspond au masquage d’un colis (si vous avez 2 colis en cours de suivi, ca permet de masquer les widgets des colis 3 à 6

require_once dirname(__FILE__) . '/../../plugins/JeedomConnect/core/class/JeedomConnectWidget.class.php';
$i = 1 ;

// Recupéraiton de la liste des colis
//$list_equipements = eqLogic::byType('Suivreuncolis') ;

$nb_colis = count($list_equipements) - 1 ;   // Nb de colis 

// pour chaque equipement de type colis (sauf 'MesColis' qui est l'equipement générique)
foreach(eqLogic::byType('Suivreuncolis', true) as $eqLogicSuivreuncolis) {
  $eq_humanname = $eqLogicSuivreuncolis->getHumanName();    // recupération du nom de l'équipement
  $eq_name = $eqLogicSuivreuncolis->getName();
  $eq_colis_virtuel = '#[Colis][Colis '.$i.']' ; 
  if ( $eq_name != 'Mes colis' ) {
    $eq_etat = cmd::byString('#'.$eq_humanname.'[Etat]#')->execCmd() ;
    $eq_heure = cmd::byString('#'.$eq_humanname.'[Horodatage]#')->execCmd() ;
    $numSuivi= $eqLogicSuivreuncolis->getConfiguration()['numsuivi'];
    
    $scenario->setLog('Colis N°'.$i);
    $scenario->setLog('   - Colis  : '.$eq_name);
    $scenario->setLog('   - Numéro : '.$numSuivi);

   
//    $eq_codesuivi = cmd::byString('#'.$eq_humanname.'[Horodatage]#')->execCmd() ;
//    cmd::byString($eq_colis_virtuel.'[Equipement]#')->event($eq_humanname) ;
    cmd::byString($eq_colis_virtuel.'[Nom]#')->event($eq_name) ;
    cmd::byString($eq_colis_virtuel.'[Code Suivi]#')->event($numSuivi) ;
    cmd::byString($eq_colis_virtuel.'[Suppression suivi colis (valeur)]#')->event(0) ;
    

    if ( $eq_etat == '' ) {                  // Si Etat vide --> Pas de suivi et horodatage à l'heure courante
      cmd::byString($eq_colis_virtuel.'[Etat]#')->event('Pas de suivi') ;
      cmd::byString($eq_colis_virtuel.'[Horodatage]#')->event(date("d-m-Y H:i")) ;
      $scenario->setLog('   - Etat   : Pas de suivi');
      $scenario->setLog('   - Heure  : '.date("d-m-Y H:i"));
    }
    else {									// Si Etat non vide on renseigne l'état et l'heure de chgt d'etat
      cmd::byString($eq_colis_virtuel.'[Etat]#')->event($eq_etat) ;
      cmd::byString($eq_colis_virtuel.'[Horodatage]#')->event($eq_heure) ;
      $scenario->setLog('   - Etat   : '.$eq_etat);
      $scenario->setLog('   - Heure  : '.$eq_heure);
    }
    
    switch ($i) {  // on active l'équipement JC concerné
    case 1:
        JeedomConnectWidget::updateConfig(141 , enable , true  ); //WidgetID Colis 1
        JeedomConnectWidget::updateConfig(197 , enable , true  ); //widgetID supp colis 1
        sleep(1) ;
        break;
    case 2:
        JeedomConnectWidget::updateConfig(142 , enable , true  );
        JeedomConnectWidget::updateConfig(203 , enable , true  );
        sleep(1) ;
        break;
    case 3:
        JeedomConnectWidget::updateConfig(143 , enable , true  );
        JeedomConnectWidget::updateConfig(204 , enable , true  );
        sleep(1) ;
      	break;
    case 4:
        JeedomConnectWidget::updateConfig(147 , enable , true  );
        JeedomConnectWidget::updateConfig(205 , enable , true  );
        sleep(1) ;
      	break;
    case 5:
        JeedomConnectWidget::updateConfig(148 , enable , true  );
        JeedomConnectWidget::updateConfig(213 , enable , true  );
        sleep(1) ;
      	break;
    case 6:
        JeedomConnectWidget::updateConfig(149 , enable , true  );
        JeedomConnectWidget::updateConfig(214 , enable , true  );
        sleep(1) ;
      	break;
    }
    

   //$suivi_tous_colis = cmd::byString('#7798#')->execCmd() ;
    $i++ ;    
  }
}

for ($j = $i; $j <= 6; $j++) {      // on desactive les équipements JC non utilisés
  switch ($j) {
    case 1:
        JeedomConnectWidget::updateConfig(141 , enable , false  ); //WidgetID Colis 1
        JeedomConnectWidget::updateConfig(197 , enable , false  ); //widgetID supp colis 1
        sleep(1) ;
        break;
    case 2:
        JeedomConnectWidget::updateConfig(142 , enable , false  );
        JeedomConnectWidget::updateConfig(203 , enable , false  );
        sleep(1) ;
        break;
    case 3:
        JeedomConnectWidget::updateConfig(143 , enable , false  );
        JeedomConnectWidget::updateConfig(204 , enable , false  );
        sleep(1) ;
      	break;
    case 4:
        JeedomConnectWidget::updateConfig(147 , enable , false  );
        JeedomConnectWidget::updateConfig(205 , enable , false  );
        sleep(1) ;
      	break;
    case 5:
        JeedomConnectWidget::updateConfig(148 , enable , false  );
        JeedomConnectWidget::updateConfig(213 , enable , false  );
        sleep(1) ;
      	break;
    case 6:
        JeedomConnectWidget::updateConfig(149 , enable , false  );
        JeedomConnectWidget::updateConfig(214 , enable , false  );
        sleep(1) ;
      	break;
  }
}

Suivi Colis - MAJ colis
déclencheurs provoqués : les virtuels (x6) « code suivi » et « transporteur (valeur) » mis à jour via l’app JC
je rajoute comme condition != ‹  › pour eviter de mettre à jour avec un champ vide (erreur de saisie)

Le bloc code : pas de personnalisation necessaire !

require_once dirname(__FILE__) . '/../../plugins/JeedomConnect/core/class/JeedomConnectWidget.class.php';

// determination de l'équipement concerné en focntion du trigger
$trigger = cmd::cmdToHumanReadable($scenario->getRealTrigger());
$cmd = cmd::byString($trigger);
$value = $cmd->execCmd();
$eqLogicHumanName = $cmd->getEqLogic()->getHumanName(); // renvoi --> [objet][equipement]

// recupération du nom du colis 
$nomColis=cmd::byString('#'.$eqLogicHumanName.'[Nom]#')->execCmd() ;

// recupération du nouveau numéro de suivi et du nom du transpoteur
$numSuiviColis=cmd::byString('#'.$eqLogicHumanName.'[Code Suivi]#')->execCmd() ;
$transporteurColis=cmd::byString('#'.$eqLogicHumanName.'[Transporteur (valeur)]#')->execCmd() ;

// mise à jour de la fiche colis 
foreach(eqLogic::byType('Suivreuncolis', true) as $eqLogicSuivreuncolis) {
   if ( $nomColis == $eqLogicSuivreuncolis->getName() ) {
      $precedentNumSuiviColis = $eqLogicSuivreuncolis->getConfiguration()['numsuivi'] ;
      $precedentTransporteurColis = $eqLogicSuivreuncolis->getConfiguration()['transporteur'] ;
      $scenario->setLog('Colis : '.$nomColis) ;
      if ( $numSuiviColis != $precedentNumSuiviColis ) {
         $eqLogicSuivreuncolis->setConfiguration('numsuivi',$numSuiviColis);
  	     $scenario->setLog('	- Mise à jour numéro de suivi : ' .$precedentNumSuiviColis.' -> '.$numSuiviColis);
  	     $eqLogicSuivreuncolis->save();
      }
     else $scenario->setLog('	- Pas de changement du numéro de suivi');
     if ( $transporteurColis != $precedentTransporteurColis ) {
         $eqLogicSuivreuncolis->setConfiguration('transporteur',$transporteurColis);
  	     $scenario->setLog('	- Mise à jour du transporteur : ' .$precedentTransporteurColis.' -> '.$transporteurColis);
  	     $eqLogicSuivreuncolis->save();
      }
      else $scenario->setLog('	- Pas de changement du transporteur');
   }
}

et enfin le dernier : Suivi Colis - Suppression colis
declencheur : la commande « suppression suivi colis » == 1 pour chacun des colis :

Et le bloc code … rien n’est à personnaliser normalement

require_once dirname(__FILE__) . '/../../plugins/JeedomConnect/core/class/JeedomConnectWidget.class.php';

// determination de l'équipement concerné en focntion du trigger
$trigger = cmd::cmdToHumanReadable($scenario->getRealTrigger());
$cmd = cmd::byString($trigger);
$value = $cmd->execCmd();
$eqLogicHumanName = $cmd->getEqLogic()->getHumanName(); // renvoi --> [objet][equipement]

// recupération du nom du colis 
$nomcolis=cmd::byString('#'.$eqLogicHumanName.'[Nom]#')->execCmd() ;

foreach(eqLogic::byType('Suivreuncolis', true) as $eqLogicSuivreuncolis) {
   	if ( $nomcolis == $eqLogicSuivreuncolis->getName() ) {
      $scenario->setLog('Suppression Suivi Colis : ' .$nomcolis);
  	  $eqLogicSuivreuncolis->remove();
      
      // remise à 0 du virtuel
      cmd::byString('#'.$eqLogicHumanName.'[Nom]#')->event('') ;
      cmd::byString('#'.$eqLogicHumanName.'[Code Suivi]#')->event('') ;
      cmd::byString('#'.$eqLogicHumanName.'[Suppression suivi colis (valeur)]#')->event(0) ;
      cmd::byString('#'.$eqLogicHumanName.'[Etat]#')->event('') ;
      cmd::byString('#'.$eqLogicHumanName.'[Horodatage]#')->event('') ;
    }
}

et je rajoute à la fin un lancement du scenario de mise à jour du resumé

Il ne reste plus qu’à créer le dernier widget d’ajout d’un colis qui se base sur le scenario ‹ Suivi Colis - Ajout colis ›
widget de type scenario
affichage mode carte
!! il est important de masquer, en mode carte le statut pour que le lancement ne se fasse qu’en mode detail.
Ca permet ainsi de renseigner les différentes infos du colis puis seulement après de lancer le scenario

pour la saisie, on renseigne les differents champs, colis/commentaire/suivi/transporteur puis on clique sur action pour créer le colis

Voilà, j’espère n’avoir rien oublié et je vous laisse faire des retours.

Bon courage à ceux qui se lancent … après tout ca, vous serez des experts du plugin-jeedomconnect
(pensez à partager ce que vous avez fait !)

8 « J'aime »

:+1:

Reste plus qu’à corréler tout ça avec sa Boîte aux lettres physique connectée pour être sur que le colis est réellement livré.

2 « J'aime »

Il peut encore être volé … c’est a la mode :sob:

Alors pour cela mettre une caméra au dessus de la BAL (ce que j’ai fais)

La tu te fait refaire le colis plus une cam :rofl:

Y a un détecteur de mouvement collé à la caméra et branché sur une alarme sonore au cas où on vole la caméra
:joy:

Tu ne crois pas si bien dire ; sortie caméra HIKVISION branchée sur alarme reliée au NVR qui détecte les tentatives de destruction ou de dégradation.

Donc on peut tjrs voler le colis et la caméra mais au moins on sait qu’ils l’ont été et avec un peu de chance par qui et quand (mais le colis reste volé hélas) :slight_smile:

3 « J'aime »

Super Tuto, merci @ngrataloup

Par contre quelques interrogations :

  • Dans l’écran général, je n’ai pas l’état du colis et l’horodatage qui apparait.

  • Le transporteur ne se « fige », je vois le changement mais il se vide directement. Je ne sais pas ce qu’il se passe.

Pour info :

Jeedom Core : 4.2.15
Version JC : [beta] 1.2.1

Equipements :
  iPhone Ben JC : v1.2.1 sur ios

Merci pour votre aide

Bonsoir @Benbboy

A partir du telephone, et pour chaque widget suivi colis
→ personalisation
mode carte
dans le titre, mets la commande nom du colis
dans le sous titre, l’état et l’horodatage
après avoir ajouté ces infos en infos supplémentaires

Essaye de modifier le virtuel comme ceci (cf encadré rouge !)

N’hésites pas à me mettre des screenshots de tes paramétrages

1 « J'aime »

Merci pour ton retour @ngrataloup

Bon pour l’horadatage et l’état, ça ne vient pas de la configuration JC mais du plugin Suivi Colis et très certainement du tracking du transporteur qui n’envoie -pas encore- d’information.

Pour le transporteur dans le virtuel, c’est bien ça, ça fonctionne maintenant.

Merci pour ton aide

Tu devrais à minima avoir « pas de suivi », avec l’horodatage du dernier check. il faudrait pour une livraison aller voir la valeur du virtuel correspond. Si il n’y a rien, c’est qu’il y a sans doute un pb dans le scénario

Sans info du transporteur :

Ca fonctionne, je ne sais pas où j’ai pêché mais maintenant c’est ok.
Par contre, quand j’ajoute un colis, que je renseigne son nom et que je valide, ça fait planter l’appli sur mon téléphone

planter ? c’est à dire, fermeture de l’app, figeage, message d’erreur ?
C’est surprenant parceque tout ce passe coté jeedom

Fermture de l’appli
Ca plante quand je clique sur « Envoyer »

RPReplay_Final1652215258

quelle version ?

Celle ci :

J’ai encore foiré un truc :rofl: :rofl: :rofl:

Oui, le fait d’etre sur IOS (mais personne n’est parfait :joy:)
Est-ce que tu peux essayer de créer un autre widget de type evenement en dehors cette page colis et voir si tu as le meme symptome ?

Eternel débat et de bonne guerre :heart:
Je vois ça demain et je reviens vers toi pour t’informer.
En tout cas merci pour le support :+1:

Ya rien cote log dans l appli ?

J’ai ça …

19:49:22 | INFO | Start logger
19:49:27 | DEBUG | [HTTP] received data {"type":"CMD_INFO","payload":[{"id":"7645","value":0,"modified":1652263219,"collectDate":1652294966},{"id":"9055","value":1,"modified":1652287210,"collectDate":1652294966}]}
19:49:42 | DEBUG | [HTTP] received data {"type":"CMD_INFO","payload":[{"id":"7645","value":0,"modified":1652263219,"collectDate":1652294982},{"id":"9055","value":1,"modified":1652287210,"collectDate":1652294982}]}
19:49:46 | DEBUG | sendToJcApi  http://192.168.0.109/plugins/JeedomConnect/core/api/JeedomConnect.api.php {"method":"SET_EVENT","params":{"commandId":"8740","message":"Test 2","apiKey":".............................................f"},"jsonrpc":"2.0","id":1652294986154}

J’ai caché l’APIKEY