Tuto : integrer le prix des carburants dans jeedomconnect (+ geolocalisation temps reel et guidage vers les stations)


IMPORTANT : Suite à l’évolution du plugin-prixcarburants, le tuto a été complement revu. ne pas tenir compte de cette premiere version et aller au post ci-après : Tuto : integrer le prix des carburants dans jeedomconnect (+ geolocalisation temps reel et guidage vers les stations) - #65 par ngrataloup

Suite à plusieurs demandes en MP et à mon screenshot sur le thread :

Voici un petit tuto pour réaliser cet écran.

Tout se passe coté plugin-jeedomconnect , je préjuge donc que vous avez paramétré correctement e plugin plugin-prixcarburants

EDIT : tout en fin de thread, rajout d’une solution pour avoir un nom plus parlant que #1902# dans les paramétrages

EDIT 2 : rajout de paramétrage pour utilisation de la localisation temps reel + navigation vers les stations
EDIT 3 : penser à rajouter une routine pour mettre à jour le fichier des prix des stations essence

Créer un widget de type générique numérique
Ne pas renseigner le nom du widget, il sera renseigné à la fin pour etre dynamique (infos complementaires)

TOUTES LES COMMANDES DOIVENT ETRE SAISIES AVEC L’ICONE + ET NON MANUELLEMENT

1 - renseigner le champ statut avec la commande [top 1 prix]
2 - créer dans les infos complémentaires 3 infos avec les commandes [Top 1 Adresse], [Top 1 MAJ] et [Top 1 Distance]
3 - avec le +, renseigner le champ titre avec l’info complementaire [Top 1 Adresse]
4 - renseigner le champ sous-titre comme vous le souhaitez, pour ma part , sous-titre personnalisé:

#[xxxxx][xxxxx][Top 1 Distance]# km (#[xxxxx][xxxxx][Top 1 MAJ]#)

5 - Renseigner des images sous condition pour personnaliser le logo affiché en fonction du distributeur
avec une condition « textuelle » (toujours utiliser le + pour sélectionner la commande. Utiliser la condition suivante (merci @tomitomas et @jared-94 pour les opérateurs de comparaison)

(#[xxxxxx][xxxxxx][Top 1 Adresse]#).startsWith ("Leclerc") 
pour commence par ...
ou 
(#[xxxxxx][xxxxxx][Top 1 Adresse]#).includes ("Leclerc") 
pour contient ...

et mettre le logo … Leclerc en face
Mettre autant de conditions que de distributeurs de carburants autour de chez vous …
et mettre un logo par defaut au cas où le fournisseur ne soit pas reconnu
Viessmann-1364

vous pouvez trouver les logos de vos supermarchés préférés ici :

(merci @dsigmoun pour le tuyau)

6 - mettez vous en mode carte par defaut

« Renouvelez ceci pour les 2 ou 3 ou X distributeurs de carburant si vous souhaitez voir afficher 2 , 3 ou X distributeurs (top 2, top 3, …) »

pour résumer :

Dans votre équipement JC, faites vous plaisir … pour ma part, création d’un groupe « prix carburant » et intégration des 3 widgets créés (top 1, top 2 et top 3) en mode carte

EDIT : Suite à échange avec @Margab et pour éviter d’avoir à l’affichage (notamment dans les écrans de paramétrage/sélection des widgets) des noms des widget de type #1902#, une solution consiste à nommer le widget (coté plugin jeedom ou edition du widget coté app JC) avec un nom parlant type « prix carburant top 1 » et ensuite à personnaliser le nom de ce widget coté app JC et renseignant la commande [Top 1 adresse] déjà présente en informations complémentaires.
En faisant ainsi, le Widget à un nom parlant dans les paramétrages et un nom personnalisé (le nom de la station essence) à l’affchage

Bonne implementation …

Norbert

17 « J'aime »

Au top, merci

Bonjour,je confirme que mon affichage est devenu parfait de mon coté ,merci beaucoup @ngrataloup

Salut,

Merci pour l’idée et le tuto, je n’utilisais pas le plugin de suivi des coûts carburants, c’est chose faite :grinning_face_with_smiling_eyes:

J’allais justement indiqué qu’il était préférable selon moi de nommer les widgets avec des vrais nom pour que ce soit plus propre puis de personnaliser ce nom pour afficher l’adresse mais ça a été rajouté dans le tuto :sweat_smile:

3 « J'aime »

Hello,
Merci pour ce tuto vraiment sympa, complet, et intéressant.

Par contre, je rencontre « un petit souci » si on veut.
Dans JeedomConnect pour personnaliser le nom du widget, au lieu d’avoir les noms de commande en clair style : #[xxxxxx][xxxxxx][Top 1 Adresse]#, j’ai l’ID de la commande…

Merci encore pour le tuto

menu / pref / recharger les données

@tomitomas Yes, je pensais l’avoir fais … trop d’essai !

Une petite évolution du tuto pour :

  • intégrer la gestion de la position temps réel pour la recherche des stations essence les plus proche via la commande position de plugin-jeedomconnect
  • intégrer la mise à jour de widget de type webview dans plugin-jeedomconnect pour accéder à l’itinéraire vers la station essence (foncitonne avec waze et googlemaps)

Merci à @chris94440 pour son aide et ces conseils !!!

  1. créer un scenario avec le bloc code ci-dessous - A personnaliser avec vos données - scénario planifier (1x/jour) :
    C’est ce scenario qui sera en charge de la MAJ des prix des carburants en fonction de la position JeedomConnect (commande position d’un equipement JC)
// Bloc code de recherche des stations essences les moins cheres

// Nom de l'equipement créer dans le plugin prixcarburant
$eq_prixcarburant='[Données Techniques][Prix Gasoil]' ;

// critères de recherche à personaliser
$typecarburant='Gazole';
$rayon='20' ;
$nbstation='3';   // Si augmentation de ce chiffre, necessité d'adapter le script
$monformatdate='j M Y G:i';

// Critères de navigation à personnaliser 
$appNavigation='waze';  // waze - googlemaps - aucun
$cmd_coord_gps_actuel = '#[Norbert][JC_Norbert][Position]#'; // commande de localisation
$widgetid_loc_top1 = 163 ;  // id du widget de type webview pour la localisation du top 1 sur Jeedomconnect
$widgetid_loc_top2 = 164 ;  // id du widget de type webview pour la localisation du top 2 sur Jeedomconnect
$widgetid_loc_top3 = 165 ;  // id du widget de type webview pour la localisation du top 3 sur Jeedomconnect

//URLs de navigation (ne pas changer)
$urlNavigation_googlemap='https://www.google.com/maps/dir/?api=1&travelmode=driving&dir_action=navigate&origin=';
$urlNavigation_waze='https://waze.com/ul?';
$pathPlugin= '/var/www/html/plugins/prixcarburants/core/class/';
$coord_gps_actuel = explode(",",cmd::byString($cmd_coord_gps_actuel)->execCmd());

$malat=$coord_gps_actuel[0];
$malng=$coord_gps_actuel[1];

$scenario->setLog('	* Latitude : ' . $malat. '| longitude : ' . $malng );

$response = array();
$idx=0;

//Prepare and parse XML file
$scenario->setLog('		-> path fichier xml : ' . $pathPlugin.'/PrixCarburants_instantane.xml');
$reader = XMLReader::open($pathPlugin.'/PrixCarburants_instantane.xml');
$doc = new DOMDocument;
while($reader->read()) {
	if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'pdv') {
		$lat = $reader->getAttribute('latitude')/100000;
		$lng = $reader->getAttribute('longitude')/100000;
		$mastationid = $reader->getAttribute('id');
		$MaStationDep = intval(substr($reader->getAttribute('cp'), 0, 2));
		$dist = 0;
		$MonTest = False;
		$EstFavoris = False;
	  
		$dist = prixcarburants::distance($malat,$malng,$lat,$lng);
		
      
      	if($dist > $rayon) {
        	continue;
        }
		
		//Import and review XML file      	
		$unestation = simplexml_import_dom($doc->importNode($reader->expand(), true));
		foreach ($unestation->prix as $prix) {
			if ($prix->attributes()->nom == $typecarburant){ //Filter by fuel type
              	
				$prixlitre = $prix->attributes()->valeur.'';
				$maj = $prix->attributes()->maj.'';
				$marque = prixcarburants::getMarqueStation($mastationid, $MaStationDep);
                
              	$maselection[$idx]['adresse'] = $marque.', '.$unestation->ville;
                $maselection[$idx]['prix'] = $prixlitre;
                $maselection[$idx]['maj']  = date($monformatdate, strtotime($maj));
                //if ($dminus5 >= strtotime($maj)) $maselection[$idx]['maj'] = "<div style='color:red;'>".$maselection[$idx]['maj'].'</div>';

                $maselection[$idx]['distance'] = $dist;
                $maselection[$idx]['id'] = $mastationid;
                $maselection[$idx]['coordinates'] = $lat.','.$lng ;
                $idx++;
			}
		}
	}
}
$reader->close();
usort($maselection, "prixcarburants::custom_sort");

For($i = 1; $i <= $nbstation; $i++) {
  $scenario->setLog(json_encode($maselection[$i-1]));
  cmd::byString('#'.$eq_prixcarburant.'[Top '.$i.' ID]#')->event($maselection[$i-1]['id']);
  cmd::byString('#'.$eq_prixcarburant.'[Top '.$i.' Adresse]#')->event(ucwords(strtolower($maselection[$i-1]['adresse'])," -\t\r\n\f\v'"));
  cmd::byString('#'.$eq_prixcarburant.'[Top '.$i.' Prix]#')->event($maselection[$i-1]['prix']);
  cmd::byString('#'.$eq_prixcarburant.'[Top '.$i.' MAJ]#')->event($maselection[$i-1]['maj']);
  cmd::byString('#'.$eq_prixcarburant.'[Top '.$i.' Distance]#')->event($maselection[$i-1]['distance']);
  
  switch ($i) {
    case 1:
      $widgetId=$widgetid_loc_top1;  // id du widget de type webview pour la localisation du top 1 sur Jeedomconnect
      break;
    case 2:
      $widgetId=$widgetid_loc_top2;  // id du widget de type webview pour la localisation du top 2 sur Jeedomconnect
      break;
    case 3:
      $widgetId=$widgetid_loc_top3;  // id du widget de type webview pour la localisation du top 3 sur Jeedomconnect
      break;
    }
if ($appNavigation == 'waze') {
      	$url=$urlNavigation_waze.'to=ll.'.urlencode($maselection[$i - 1]['coordinates']).'&from=ll.'. urlencode($malat.','.$malng). '&navigate=yes';
        $widgetKey='url';
        $widgetValue=$url;
        JeedomConnectWidget::updateConfig($widgetId,$widgetKey,$widgetValue);
} elseif ($appNavigation == 'googlemaps') {
      	    $url=$urlNavigation_googlemap . urlencode($malat.','.$malng).'&destination='.urlencode($maselection[$i - 1]['adresse']);
            $widgetKey='url';
            $widgetValue=$url;
            JeedomConnectWidget::updateConfig($widgetId,$widgetKey,$widgetValue);
}

  array_push($response, $maselection[$i-1]);
}

$scenario->setLog('		=> response (' . sizeof($response) . ') : ' . json_encode($response));
$scenario->setLog('End scenario recuperation prix carburant en fonction d\'une localisation');

2 - Désactiver de la mise à jour cron dans le paramétrage du plugin-prixcarburants (pour eviter une MAJ des stations avec la localisation Jeedom

3 - créer des widget webview coté plugin-jeedomconnect qui permettront d’acceder au trajet pour acceder à la station, et reporter les id de ces widget dans le bloc code

4 - paramétrer votre appli JC comme bon vous semble … voici ce que j’ai fait :grin:

  • possibilité de mise à jour des infos directement depuis Jeedom (widget scenario avec le scenario ci-dessus)
  • personnalisation du rayon de recherche (non documenté dans ce tuto, widget slider (avec commande virtuelle slider associée) utiliser pour personnaliser la variable $rayon du scenario
  • integration d’un bouton Waze (widgets webview créés ci-dessus affichés en mode vignette) en face de chaque station
  • et pour finir un petit graphique sur l’évolution du prix du top 1 (historisation du prix du top 1)
6 « J'aime »

@ngrataloup super merci pour ce plus et merci aussi à @chris94440

je règle mon soucis de positionnement via JC et je vous ferai un tiot retour.

@ngrataloup désolé si je passe pour une quiche mais pourrais tu mettre un screen du widget webview ou indiquer l’url à remplir.
Merci

Pas de souci.
Tu mets n’importe quoi dans le champ URL (rien dans URL local). Le contenu du champ URL sera écrasé au premier lancement du scénario et remplacé par le bon lien Waze ou googlemap.

Ok merci …

Par contre, quand je lance le scénario manuellement, dans les logs j’ai un « Class ‘JeedomConnectWidget’ not found »
Et les webview ne se mette pas à jour…

SI tu rajoute ceci en debut de bloc code ?

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

Alors je n’ai plus l’erreur par contre le script se lance bien mais il me vide les infos du plugin Prix Carburant.

Dans le log
Il récupère bien mes coordonnées
Il récupère les infos du plugin mais au lieu d’avoir des coordonnées ou autres il me met « Nul » à 3 reprises.

scenario43.log (806 Octets)

Les informations des prix des carburants ne sont pas récupérées. Tu doit avoir un pb, soit sur le nom de l’équipement, soit sur le type de carburant (premières lignes du script)

hello,
merci j’ai vu ton mp, je t’y ai répondu.

j’ai de nouveau regardai les infos, le script, le nom de l’équipement, je n’ai pas vue de coquille…

@ngrataloup @chris94440 comme promis je vous fais un petit retour sur le script, hormis les petits soucis rencontrés (géré par @ngrataloup :pray:) c’est pratique, fonctionnelle….
Je ne pourrais plus me perdre pour faire le plein :rofl::rofl::rofl: dans une région inconnue

PS: pour le SP95E10 mettre uniquement E10 au niveau du script (:wink: @ngrataloup)

Du coup, en fouillant un peu suite à ce pb de E10, je me suis aperçu qu’en désactivant le cron quotidien, il n’y avait plus de récup de la maj des prix des carburants … Ce qui est donc cool, c’est qu’on aura jamais d’augmentation du prix du plein !
… A corriger, donc :wink:

1 « J'aime »

Comment faire pour récupérer le ligne Url * pour le Webview ?Merci

Un peu de lecture plus haut :wink:
La ligne est générée automatiquement par le scenario … pour la cr"éation du widget, tu peux renseigner n’importe quoi … « toto » par exemple