API Sncf

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: API Sncf

Message par papoo »

pour connaitre les prochains trains entre deux villes et les éventuels retard, la requete ce compose comme ceci

Code : Tout sélectionner

https://{clé_d’authentification}@api.sncf.com/v1/coverage/sncf/journeys?from=admin:114172extern&to=admin:132348extern&datetime=20161114T23:08&datetime_represents=departure&min_nb_journeys=4
114172 etant la gare de Limoges
132348 étant la gare de Poitiers
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: API Sncf

Message par papoo »

allez pour t'aider et vu qu'il n'y a pas grand chose à faire en reprenant un script existant pour l'eedomus

Lancement par crontab

Code : Tout sélectionner

crontab -e
Ajouter les lignes suivantes pour une programmation toutes les 10 minutes de 7h à 9h et de 16h à 18h.

Code : Tout sélectionner


*/10 7,8 * * * /usr/bin/php /home/pi/domoticz/scripts/php/gare.php a
*/10 16,17 * * * /usr/bin/php /home/pi/domoticz/scripts/php/gare.php r
créer un fichier gare.php dans le répertoire /home/pi/domoticz/scripts/php/
et coller le code suivant puis renseignez les variables

Code : Tout sélectionner

<?php
/*************************************************************************************/
/*         ### Report MAJ information train de la Gare SNCF ###                      */
/*             		 Adaptation pour domoticz papoo                               */
/*              Développement originel par eedomusbox@gmail.com                      */
/*                                                                                   */
/*************************************************************************************/
/*-------------------------------------------- */
/*------------ Variables à éditer ------------ */
/*-------------------------------------------- */

$IPdomoticz = "192.168.1.24:8080"; //<username:password@>domoticz-ip<:port>
$periph_id = '720';

// Identifiants de l'API SNCF https://data.sncf.com/api/fr/documentation
$NbJourneys ="2"; //Nb de trains minimum par jour à afficher
$api_sncf_user = 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'';
$api_sncf_mdp  = ''; // ne pas modifier
// Fin Identifiants de l'API SNCF

// Initialiation des variables
// Pour trouver l'id de la ville rechercher "id" dans la requete suivante https://api.sncf.com/v1/coverage/sncf/places?q=LIMOGES
$VilleDepart  = 'admin:114172extern'; //LIMOGES
$VilleArrivee = 'admin:147559extern'; //ORLEANS
//$VilleArrivee = 'admin:132348extern'; //POITIERS

/*-------------------------------------------- */
/*--------- Fin Variables à éditer ----------- */
/*-------------------------------------------- */
$result = '';

// Récupération des paramètres de la requête : 2 methodes, une Web et une Raspberry
if (isset($_GET['trajet'])) {
    $SensTrajet = $_GET['trajet'];
	$rChariot = "<BR>";  //Retour à la ligne
} else {
	$SensTrajet = $_SERVER['argv'][1];
	$rChariot = "\n"; //Retour à la ligne
}
 
//******************************** Contruction du trajet *****************************/
switch ($SensTrajet) {
	case 'a':
		$gareDepart = $VilleDepart;
		$gareArrive = $VilleArrivee;
		break;
	case 'r':
		$gareDepart = $VilleArrivee;
		$gareArrive = $VilleDepart; 
		break;
	default:
		$gareDepart = $VilleDepart;
		$gareArrive = $VilleArrivee;
		break;
}

 
//******************************** Date de heures d'exection *****************************/
date_default_timezone_set("Europe/Paris");
$date = date("Ymd\TH:i"); 
echo $rChariot."Date et heure d'execution: ".$date.$rChariot;

//********************************  Récupération des données *****************************/
$query = 'https://'.$api_sncf_user.'@api.sncf.com/v1/coverage/sncf/journeys?from='.$gareDepart.'&to='.$gareArrive.'&datetime='.$date.'&datetime_represents=departure&min_nb_journeys='.$NbJourneys;
echo $rChariot.'Requete: '.$query.$rChariot.$rChariot;

$response=file_get_contents($query);
$json = json_decode($response, true);
// Boucle sur les trajets
echo $rChariot."************TRAINS*************";

foreach($json['journeys'] as $trains) // Lecture des trajets
	{  	
		$dateDepart = $trains['departure_date_time']; echo $rChariot.'Heure de depart: '.$dateDepart; // Date de départ
		$HeuredeDepart = substr($dateDepart,9,4);  // Heure de départ
		
		$dateArrive = $trains['arrival_date_time']; echo $rChariot."Heure d'arrive: ".$dateArrive; // Date d'arrivée
		$heuredarrive = substr($dateArrive,9,4);  // Heure d'arrivée
		$numtrain = $trains['sections'][1]['display_informations']['headsign']; //Numero du train
		echo $rChariot.'Numero de train: '.$numtrain;
		
		if ( $trains['status'] != "" )  // Cas du train en retard
			{ 	$retard = '';
				$text = '';
				echo $rChariot.'Statut du train: '.$trains['status'] ;
				if ($trains['status'] == 'NO_SERVICE'){ 
					echo $rChariot."************TRAINS*************";
					continue; //Affichage du statut}
				}
				$numdisrup = $trains['sections'][1]['display_informations']['links'][0]['id']; //Affichage de l'ID de retard
				echo $rChariot.'ID de retard: '.$numdisrup;
				
				//Récupération des retards
				$retards = $json['disruptions']; 
				//Recherche des retards
				foreach($retards as $retard)
				{   echo $rChariot.'ID de retard dans les retards: '.$retard['disruption_id'];
				
					if ( $retard['disruption_id']== $numdisrup )
						{ 	// Boucle sur l'ensemble des impacts du retard			
							foreach($retard['impacted_objects'][0]['impacted_stops'] as $impactStop)
								{ if ( substr($impactStop['base_departure_time'],0,4) == $HeuredeDepart )  // Recherche du lieu que l'on veut
									{   
										$updatetime = $impactStop['amended_departure_time']; // Nouvel Horaire
										echo $rChariot.'Nouvelle heure de depart: '; echo substr($updatetime,0,2);echo substr($updatetime,2,2);
										// Calcul du retard
										$retard =  ( substr($updatetime,0,2) * 60 + substr($updatetime,2,2)  ) - 
												   ( substr($HeuredeDepart,0,2) * 60 + substr($HeuredeDepart,2,2) ); //En minutes
										echo $rChariot.'Retard en mn: '.$retard; // Affichage du retard
										$text = '-'.$retard.'mn, '; 
										break;
									}
								}
						}
					
				}
			}
			else 
			{ $text = ', ';} // Train est à l'heure 
			
		    $result = $result.substr($HeuredeDepart,0,2).'h'.substr($HeuredeDepart,2,2).$text;
			echo $rChariot."************TRAINS*************";
	}
	
	$result = substr($result,0,-2);; // Supprime les deux derniers caractères
	echo $rChariot.$rChariot."Resultat: ".$result.$rChariot;  // Affichage des résultats
	
	$json_result = maj_periph($periph_id,$result); //Mise à jour Eedomus

// Fonction
function supprimer_accents($str, $encoding='ISO-8859-1')
{
    // transformer les caractères accentués en entités HTML
    $str = htmlentities($str, ENT_NOQUOTES, $encoding);
  
    // remplacer les entités HTML pour avoir juste le premier caractères non accentués
    // Exemple : "&ecute;" => "e", "&Ecute;" => "E", "Ã " => "a" ...
    $str = preg_replace('#&([A-za-z])(?:acute|grave|cedil|circ|orn|ring|slash|th|tilde|uml);#', '\1', $str);
  
    // Remplacer les ligatures tel que : Œ, Æ ...
    // Exemple "Å“" => "oe"
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
    // Supprimer tout le reste
    $str = preg_replace('#&[^;]+;#', '', $str);
    // Supprimer les espaces
    $str = preg_replace('/\s/', '-', $str);
  
    return $str;
}

function maj_periph( $periphID, $val )
{
	global $IPdomoticz;
	global $rChariot;

// Remplacement des blancs par le code hexa
	$val = str_replace(' ', '%20', $val);
// Remplacement des points virgules par le blanc
	$val = str_replace(';','%20', $val);
// Remplacement des accents
	$val = supprimer_accents($val);
	$val = utf8_encode($val);
	
//Contruction de l'url Local
	$url = "http://".$IPdomoticz."/json.htm?type=command"; 
	$url .= "&param=udevice";
	$url .= "&idx=$periphID";
	$url .= "&vnalue=0";
	$url .= "&svalue=$val";
	
	echo $rChariot."URL locale Mise à jour Domoticz: ".$url.$rChariot;
	
// Mis à jour du périphérique
	$result = @file_get_contents($url);
	
	$pos = strpos($result, '"OK"');
	if ($pos === false)
	{

	echo $rChariot."Une erreur est survenue lors de la mise à jour [".$result."]".$rChariot;//}
	}
	return $result;
} 
/*
/usr/bin/php /home/pi/domoticz/scripts/php/sncf.php a  //pour l'aller
/usr/bin/php /home/pi/domoticz/scripts/php/sncf.php r  //pour le retour
*/
?>
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
minos
Messages : 72
Inscription : 30 oct. 2016, 18:40

Re: API Sncf

Message par minos »

Hey Merci Papoo !! pour ce script....

j 'y suis presque .....; :roll:

voilà que je n'arrive pas à mettre à jour mon virtual Device.... tiens donc ... :cry:

Code : Tout sélectionner

root@Minas:/volume1/@appstore/domoticz/var/scripts/sncf# php gare.php a

Date et heure d'execution: 20161118T22:57

Requete: https://a733ef84-3e4èè7-4f35-b2e6-95ce08315ee9@api.sncf.com/v1/coverage/sncf/journeys?from=admin:2078971extern&to=admin:74090extern&datetime=20161118T22:57&datetime_represents=departure&min_nb_journeys=2


************TRAINS*************
Heure de depart: 20161119T060300
Heure d'arrive: 20161119T070000
Numero de train: 891432
************TRAINS*************
Heure de depart: 20161119T063200
Heure d'arrive: 20161119T071800
Numero de train: 17754
************TRAINS*************

Resultat: 06h03, 06h32

URL locale Mise ▒ jour Domoticz: http://<admin:bidule@>192.168.X.25<:8084>/json.htm?type=command&param=udevice&idx=69&vnalue=0&svalue=06h03,%2006h32

Une erreur est survenue lors de la mise ▒ jour []
Au départ je pensais à un problème d’authentification avec domoticz ...mais en fait je sais pas trop ...?


j 'investigue...
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: API Sncf

Message par deennoo »

Il te manque le port (:8080) dans ton adresse URL local
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
minos
Messages : 72
Inscription : 30 oct. 2016, 18:40

Re: API Sncf

Message par minos »

negatif Papoo,

domoticz tourne sur le 8084.... :P
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: RE: Re: API Sncf

Message par deennoo »

minos a écrit :

Code : Tout sélectionner

 http://<admin:bidule@>192.168.X.25<:8084>/json.htm?type=command&param=udevice&idx=69&vnalue=0&svalue=06h03,%2006h32


Que donne cette ligne dans ton navigateur?

Le <:8084> me semble bizzare
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
minos
Messages : 72
Inscription : 30 oct. 2016, 18:40

Re: API Sncf

Message par minos »

salut,
deennoo a écrit :Le <:8084> me semble bizzare
je suis sous syno , mon domoticz tourne sur le 8084


en enlevant le compte /motdepasse de domoticz
secu.JPG
secu.JPG (18.28 Kio) Consulté 10074 fois
j 'arrive à mettre à jour mon device trains:
trains.JPG
trains.JPG (17.51 Kio) Consulté 10074 fois

Bon le soucis , je pense est dans la forme de l'url pour passer le compte /mdp de domoticz ......?

:?

parce que compte /mdp ==> obligatoire .....lol
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: API Sncf

Message par patrice »

Bonjour
Pour le mot de passe obligatoire , tu peux dans "parametres" puis "reseau locaux" dire que tu ne veux pas de mdp pour les reseaux en local
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: API Sncf

Message par papoo »

la syntaxe pour le login /mot de passe /url n'est pas

Code : Tout sélectionner

root@Minas:/volume1/@appstore/domoticz/var/scripts/sncf# php gare.php a
mais

Code : Tout sélectionner

root:Minas@/volume1/@appstore/domoticz/var/scripts/sncf# php gare.php a
en clair
monlogin : monmotdepasse @ url : port
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
minos
Messages : 72
Inscription : 30 oct. 2016, 18:40

Re: API Sncf

Message par minos »

http://admin:test@192.168.0.25:8084/jso ... 9,%2016h42
url.JPG
url.JPG (29.45 Kio) Consulté 10057 fois
@Papoo
c'est tout Bon Papoo !!!!

je pensais au départ qu'il fallait respecter les balises de l'exemple dans le script ..... :oops:

et
patrice a écrit :Bonjour
Pour le mot de passe obligatoire , tu peux dans "parametres" puis "reseau locaux" dire que tu ne veux pas de mdp pour les reseaux en local
Je confirme ça marche aussi avec exclusion du réseau ;) ...

Merci encore à vous ...


Pensez-vous que je peux utiliser un virtual device autre que Text ....
TER.JPG
TER.JPG (18.52 Kio) Consulté 10057 fois
Répondre