Tuto : calculer la vitesse, la distance au domicile et le nb de km parcourus avec la geoloc

Hello
@ngrataloup

Suite a nos échanges, je te confirme que tous c’est mis en place une fois que je me suis éloigné de mon domicile.

1 « J'aime »

Bonjour,

Un grand merci pour le partage je viens de le mettre en place.

Par contre j’ai une petite question, lors du calcul de la distance au domicile, pourquoi on utilse la position GPS précédente ?

Il ne faudrait pas calculer la distance via la position actuelle ?

	  	$lonDelta = $lonDom - $lonTo ;
		$a = pow(cos($latDom) * sin($lonDelta), 2) + pow(cos($latTo) * sin($latDom) - sin($latTo) * cos($latDom) * cos($lonDelta), 2);
		$b = sin($latTo) * sin($latDom) + cos($latTo) * cos($latDom) * cos($lonDelta);
		$angle = atan2(sqrt($a), $b);

Un grand merci en tout cas.

1 « J'aime »

Je crois que tu as totalement raison. Sans doute un copier/coller malheureux.
Je regarde ça et corrige le post !
Merci pour le retour

EDIT : correction effectuée dans le post initial (bloc code du scenario principal)

2 « J'aime »

Hello

@ngrataloup , dis moi avec la correction tu as pas de souci de remonté avec

"Distance du jour "

Car moi sur mes trois Gsm il reste bloqué :

------------------------------------
[2022-02-26 16:01:01][SCENARIO] Lancement du scénario en mode synchrone
[2022-02-26 16:01:01][SCENARIO] Start : Scénario exécuté automatiquement sur programmation.
[2022-02-26 16:01:01][SCENARIO] Exécution du sous-élément de type [action] : code
[2022-02-26 16:01:01][SCENARIO] Exécution d'un bloc code
[2022-02-26 16:01:01][SCENARIO] Geolocalisation Aline: Pas de mouvement
[2022-02-26 16:01:01][SCENARIO] Geolocalisation Mikaël:
[2022-02-26 16:01:01][SCENARIO]   --> Distance du jour : 10995.6km (still)
[2022-02-26 16:01:01][SCENARIO]   --> Vitesse : 0km/h
[2022-02-26 16:01:01][SCENARIO]   --> Distance domicile : 4.9km
[2022-02-26 16:01:01][SCENARIO] Fin correcte du scénario
------------------------------------
------------------------------------
[2022-02-26 16:39:01][SCENARIO] Lancement du scénario en mode synchrone
[2022-02-26 16:39:01][SCENARIO] Start : Scénario exécuté automatiquement sur programmation.
[2022-02-26 16:39:01][SCENARIO] Exécution du sous-élément de type [action] : code
[2022-02-26 16:39:01][SCENARIO] Exécution d'un bloc code
[2022-02-26 16:39:01][SCENARIO] Geolocalisation Aline: Pas de mouvement
[2022-02-26 16:39:01][SCENARIO] Geolocalisation Mikaël:
[2022-02-26 16:39:01][SCENARIO]   --> Vitesse : 88km/h
[2022-02-26 16:39:01][SCENARIO]   --> Distance domicile : 3.1km
[2022-02-26 16:39:01][SCENARIO] Fin correcte du scénario
------------------------------------
------------------------------------
[2022-02-26 16:51:01][SCENARIO] Lancement du scénario en mode synchrone
[2022-02-26 16:51:02][SCENARIO] Start : Scénario exécuté automatiquement sur programmation.
[2022-02-26 16:51:02][SCENARIO] Exécution du sous-élément de type [action] : code
[2022-02-26 16:51:02][SCENARIO] Exécution d'un bloc code
[2022-02-26 16:51:02][SCENARIO] Geolocalisation Aline: Pas de mouvement
[2022-02-26 16:51:02][SCENARIO] Geolocalisation Mikaël:
[2022-02-26 16:51:02][SCENARIO]   --> Distance du jour : 10995.6km (still)
[2022-02-26 16:51:02][SCENARIO]   --> Vitesse : 1.1km/h
[2022-02-26 16:51:02][SCENARIO]   --> Distance domicile : 0km
[2022-02-26 16:51:02][SCENARIO] Geolocalisation AbriSud: Pas de mouvement
[2022-02-26 16:51:02][SCENARIO] Fin correcte du scénario

Comme tu peux le voir (Still) reste bloqué sur 10995Kms

Pas de souci de mon coté
As-tu bien mis en place le scenario de réinitialisation de cet indicateur ?

Re,

Oui oui comme suggéré par @chris94440

Comme ca je ne vois pas trop, mets moi en MP le bloc code du scenario et sceenshot des variables + screenshot de la première page du scenario

Ton petit bout de code pour remettre à 0 la variable $var_distance_jour se trouve dans une boucle SI qui n’est utilisée que lorsque les coordonnées GPS changent … Or , à 23h59, sous la couette, ca ne doit pas trop changer :sweat_smile:
Mets les quelques lignes transmises par @chris94440 tout à la fin, à l’extérieur du SI

           //init variable tous les jours
           if ((date('H')  == '23') and (date('i')  == '59') ) {
    	   $scenario->setLog('	-> init distance jour à 0');
    	   $scenario->setData($var_distance_jour, 0 ) ;
        }

Re

Donc je l’ ai décaler après la dernière {

A suivre demain matin, alors.
Lance éventuellement le scénario manuellement pour t’assurer que tu n’as pas de {} en trop ( c’est toujours ma crainte quand je déplace des bouts de code.

Re,

Ok , par contre bizarre qu’avant cela fonctionné au debut , apres mes quelques souci quand tu m’a aidé.
Car ensuite je n’est plus touché au scénario, si ce n’est qu’une mise jeedom a eu lieu entre temps …

Oui en effet j’avais fait une petite erreur et j’ai oublié de republier…dsl

1 « J'aime »

Bonjour à tous , je viens de tomber sur ce tuto , qui est super je trouve sauf que bizarrement je trouve des données plus que bizarre

Alors que je suis sur que l’on a pas fait 5000 kms dans la journée lol,

Ou est ce que j’ai pu faire une erreur en sachant que j’ai fait un copié collé du code , et que mes données gps sont rentrées dans jeedom ?
Merci pour l’aide

Il me semble que ça fait ça la première fois, les variables ne sont pas créées, et du coup, les résultats aberrants

Norbert

Cest ce que je me suis dit aussi mais ca fait 5 jours que j’ai rentré le code

Ha, ça doit donc pas être ça !
Tu peux faire un screenshot des variables ?
Et Mettre le code du scénario

voila ce que j’ai mis


et le bloc code

$noms = array('Delphine','Celya','Cedric');

// variables utilisées plusieurs fois dans le bloc code
// Necessite que la latitude et la longitude du domicile soient integrés dans les paramétrages jeedom
$heure = time();
$latDom = deg2rad(config::byKey('info::latitude','core'));  // coordonnées domicile en rad
$lonDom = deg2rad(config::byKey('info::longitude','core')); // coordonnées domicile en rad


foreach ($noms as $nom) {
	// Commande position
	$cmd_position = '#['.$nom.'][JC_'.$nom.'][Position]#' ;
    $cmd_activite = '#['.$nom.'][JC_'.$nom.'][Activité]#' ;
    // Commandes à créer  
    $cmd_vitesse = '#[Famille][Geolocalisation famille]['.$nom.'_vitesse]#' ;
  	$cmd_distance_jour_enCours = '#[Famille][Geolocalisation famille]['.$nom.'_distance_jour]#' ;
    $cmd_distance_domicile = '#[Famille][Geolocalisation famille]['.$nom.'_distance]#' ;
  
    // variables necessaires au script
  	$var_coord_prec = $nom .'_coordonnees_gps_prec' ;  // creer automatiquement
  	$var_time_coord_prec = $nom.'_coordonnees_gps_time_prec' ;  // creer automatiquement
    $var_distance_jour = $nom.'_distance_jour' ;  // creer automatiquement
    
  
  	// recuperation des coordonnées GPS  (array[0] pour la longitude, array[1] pour la lattitude
  	$coord_gps_actuel = explode("," , cmd::byString($cmd_position)->execCmd() ); //coordonnées GPS actuelles
    $activite = cmd::byString($cmd_activite)->execCmd(); // activité
	$coord_gps_prec = explode("," , $scenario->getData($var_coord_prec) ); // coordonnées GPS precedent calcul
    $coord_gps_domicile = explode("," , $scenario->getData($var_coord_domicile) );  // coordonnées GPS domicile
    $vitesse_prec = cmd::byString($cmd_vitesse)->execCmd() ; // vitesse precedente
    
  	// Si les coordonnées GPS n'ont pas changées - la vitesse et la distance au domicile n'ont pas changé depuis le dernier calcul
    // on met juste à jour le timestamps
  	if ( $coord_gps_prec[0] == $coord_gps_actuel[0] and $coord_gps_prec[1] == $coord_gps_actuel[1] ) {
      	$vitesse = 0 ;
      	if ( $vitesse_prec != 0 ) cmd::byString($cmd_vitesse)->event($vitesse) ;
      	$scenario->setData($var_time_coord_prec, $heure ) ;
//log  	$scenario->setLog('vitesse '.$nom.' : '.$vitesse.' km/h');
      	$scenario->setLog('Geolocalisation '.$nom.': Pas de mouvement');
   }
  	else {
        $scenario->setLog('Geolocalisation '.$nom.':');
		// les coordonnées GPS ont changées, calcul de la vitesse 
      	
      	// Conversion des coordonnées GPS de degrés en radians
		$latFrom = deg2rad($coord_gps_prec[0]);
		$lonFrom = deg2rad($coord_gps_prec[1]);
		$latTo = deg2rad($coord_gps_actuel[0]);
		$lonTo = deg2rad($coord_gps_actuel[1]);
		$earthRadius = '6371000' ;
      
	  	// Calcul de la distance entre les 2 points GPS
	  	$lonDelta = $lonTo - $lonFrom ;
		$a = pow(cos($latTo) * sin($lonDelta), 2) + pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
		$b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
		$angle = atan2(sqrt($a), $b);
	
	  	// Calcul de la vitesse en km/h
  		$coord_gps_time_prec = $scenario->getData($var_time_coord_prec) ;
        $distance = $angle * $earthRadius ;
      	$vitesse = $distance / ( $heure - $coord_gps_time_prec) * 3600 / 1000 ;
  
  		if ( $vitesse < 0.5 ) $vitesse = 0 ;   // Si vitesse < 0.5, vitesse == 0
        elseif ( $vitesse >= 10 ) $vitesse = round($vitesse,0)  ;  // Si vitesse > 10 , Precision sans chiffre après la virgule
    		else $vitesse = round($vitesse,1) ;
    	
      	// calcul de la distance faite / jour  ==> enregistrement
      	if ( $activite !=  'in_vehicle' ) {
          $distance_jour = $scenario->getData($var_distance_jour) ;
          $distance_jour = $distance + $distance_jour ;
          $scenario->setData($var_distance_jour, $distance_jour ) ;
          
          // enregistrment de la distance réalisée aujourdhui hors voiture
          $scenario->setLog('  --> Distance du jour : '.round($distance_jour/1000,1).'km ('.$activite.')');
          cmd::byString($cmd_distance_jour_enCours)->event( round($distance_jour/1000,1));
        }
      
        // calcul de la distance au domicile
        $lonDelta = $lonDom - $lonTo ;
	$a = pow(cos($latDom) * sin($lonDelta), 2) + pow(cos($latTo) * sin($latDom) - sin($latTo) * cos($latDom) * cos($lonDelta), 2);
	$b = sin($latTo) * sin($latDom) + cos($latTo) * cos($latDom) * cos($lonDelta);
	$angle = atan2(sqrt($a), $b);
        $distfromdom = $angle * $earthRadius / 1000 ;
        if ( $distfromdom <= 10 ) $distfromdom = round($distfromdom,1) ;
        else $distfromdom = round($distfromdom,0) ;
		// 	$scenario->setLog('vitesse '.$nom.' : '.$vitesse.' km/h');
		// 	$scenario->setLog('distance '.$nom.' : '.$distfromdom.' km');	
      
      	// Renseignement de la commande vitesse et distance au domicile
  		cmd::byString($cmd_vitesse)->event($vitesse);
        cmd::byString($cmd_distance_domicile)->event($distfromdom);
        $scenario->setLog('  --> Vitesse : '.$vitesse.'km/h');
        $scenario->setLog('  --> Distance domicile : '.$distfromdom.'km');
    	$scenario->setData($var_time_coord_prec, $heure ) ;   // dernier temps
  		$scenario->setData($var_coord_prec, $coord_gps_actuel[0].','.$coord_gps_actuel[1] ) ;  // dernieres coordonnées
        
	}
}

Bonjour Mikael,

Quelle est la meilleure manière pour mettre en place cet onglet par personne dans JC?
As tu créé un virtuel? J’ai essayé de créer un widget résumé (ou résumé de pièce) pour chaque donnée comme: Distance, Vitesse, Nbre de kms. Et mettre le tout sous un onglet ‹ Menu du haut › mais mes données ne semblent pas évoluer? …

Ex avec la vitesse:


Screenshot 2024-03-25 at 15.53.41

Mais je n’ai pas de bel affichage ni les valeures comme dans tout groupe Activité :frowning:

Merci d’avance

Avant de regarder côté JC, il faut que ça se mette à jour côté Jeedom.
Est ce que tu as une correspondance entre le bloc code du scénario et tes commandes info ?

Norbert

A priori les données fonctionnent car j’ai:

[2024-03-26 08:18:01][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2024-03-26 08:18:01][SCENARIO] - Exécution du sous-élément de type [action] : code
[2024-03-26 08:18:01][SCENARIO] Exécution d'un bloc code
[2024-03-26 08:18:01][SCENARIO] Geolocalisation Xavier:
[2024-03-26 08:18:01][SCENARIO]   --> Distance du jour : 0.6km (still)
[2024-03-26 08:18:01][SCENARIO]   --> Vitesse : 34km/h
[2024-03-26 08:18:01][SCENARIO]   --> Distance domicile : 0.6km
[2024-03-26 08:18:01][SCENARIO] Fin correcte du scénario

que je stocke dans un virtuel:

donc la correspondance doit être effective.

Et j’ai l’historique OK:

Merci