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

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

Du coup, PB réglé via ce post : Problème affichage sous titre personnalisé + test expression avec collect
(Info pour les suivants)

Le novice remercie @tomitomas :rofl:

2 « J'aime »

pour info, je te partage un lien vers les differentes possibilités : Montrez vos créations sur l'appli - #253 par ngrataloup

@Mikael utilise donc un groupe de widgets avec des widgets numériques pour chacun des éléments

Norbert

1 « J'aime »

Est ce qu’il faut créer les variables à ma mano? Car moi cela fait plusieurs jours mais je n’arrrive pas à avoir les données remontées directement dans mes virtuels.

Ai je loupé un truc?

Merci

Mon code:

Mon virtuel:

et mes variables (certaines sont crées pour les coordonnées précédentes):

Non elles sont automatiquement crées.

Tu peux mettre les logs que tu as quand tu sors le chien ?
Ta distance quotidienne est bizarre.
Tu as bien appliqué le point 4 du tuto ?

$noms = array('Xavier','Stephanie'); //,'Jossua','Victorine');

// variables utilisées plusieurs fois dans le bloc code
$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) {
	$cmd_position = '#[Déplacement][' . $nom . '][Position]#' ;
    $cmd_activite = '#[Déplacement][' . $nom . '][Activité]#' ;
    $cmd_vitesse = '#[Aucun]['.$nom.']['.$nom.'_Vitesse]#' ;
    $cmd_distance_domicile = '#[Aucun]['.$nom.']['.$nom.'_Distance]#' ;
   	$cmd_distance_jour_enCours = '#[Aucun]['.$nom.']['.$nom.'_Distance_jour]#' ;

    // 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
  	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 ) ;
      	$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  
	}
  }
  	//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 ) ;
}

J’avais rajouté les lignes dans le code pour raz dans le même scénario:
//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 ) ;*

A défaut d’avoir un chien, j’ai sorti la poubelle :slight_smile:

[2024-03-27 15:46:01][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2024-03-27 15:46:01][SCENARIO] - Exécution du sous-élément de type [action] : code
[2024-03-27 15:46:01][SCENARIO] Exécution d'un bloc code
[2024-03-27 15:46:01][SCENARIO] Geolocalisation Xavier:
[2024-03-27 15:46:01][SCENARIO]   --> Distance du jour : 9974.3km (walking)
[2024-03-27 15:46:01][SCENARIO] vitesse Xavier : 2.2 km/h
[2024-03-27 15:46:01][SCENARIO] distance Xavier : 0.1 km
[2024-03-27 15:46:01][SCENARIO]   --> Vitesse : 2.2km/h
[2024-03-27 15:46:01][SCENARIO]   --> Distance domicile : 0.1km
[2024-03-27 15:46:01][SCENARIO] Geolocalisation Stephanie: Pas de mouvement
[2024-03-27 15:46:01][SCENARIO] Fin correcte du scénario
------------------------------------
[2024-03-27 15:47:01][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2024-03-27 15:47:01][SCENARIO] - Exécution du sous-élément de type [action] : code
[2024-03-27 15:47:01][SCENARIO] Exécution d'un bloc code
[2024-03-27 15:47:01][SCENARIO] Geolocalisation Xavier:
[2024-03-27 15:47:01][SCENARIO]   --> Distance du jour : 9974.4km (walking)
[2024-03-27 15:47:01][SCENARIO] vitesse Xavier : 1.8 km/h
[2024-03-27 15:47:01][SCENARIO] distance Xavier : 0 km
[2024-03-27 15:47:01][SCENARIO]   --> Vitesse : 1.8km/h
[2024-03-27 15:47:01][SCENARIO]   --> Distance domicile : 0km
[2024-03-27 15:47:01][SCENARIO] Geolocalisation Stephanie: Pas de mouvement
[2024-03-27 15:47:01][SCENARIO] Fin correcte du scénario

voici du coup le virtuel après ce ptit tour :slight_smile:

Merci

Du coup, y a plus qu’a rentrer les poubelles demain pour s’assurer que distance_jour repart bien à 0

1 « J'aime »

Ah ah, je suis allé chercher les poubelles et pas mieux :slight_smile:

Le code est bien éxecuté mais pas de traces du reset alors je pense que mes lignes ne doivent pas être au bon endroit, je vais essayer de les remonter :slight_smile:

Meme si les poubelles aiment se balader, je n’ai pas la santé pour leur faire faire 10000 km par jour lol :stuck_out_tongue:

J’ai remonté d’un cran le code et ça à l’air de s’éxécuter et ça marche! MERCI

1 « J'aime »