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

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 »

ah bah j’aurais aimé tombé sur ce tuto il y a quelques jours…
j’ai fait quelque chose de semblable qui calcule la distance parcourue et la vitesse estimée depuis la dernière actualisation, en utilisant le plugin geoloc…
ça tient dans un virtuel.
à toutes fins utiles, je vous partage également mon code :

$cmd = cmd::byString("#[Maison][XXXX][Position]#");
$value = $cmd->execCmd();
$longueur = strlen($value);
$latitude = floatval(substr($value,0,strripos($value,',')));
$longitude = floatval(substr($value,-($longueur-strripos($value,',')-1)));
$cmd2 = cmd::byString("#[Essence][Distance et vitesse][longitude]#");
$cmd3 = cmd::byString("#[Essence][Distance et vitesse][latitude]#");
$old_long= $cmd2->execCmd();
$old_lat= $cmd3->execCmd();
$collectDate = $cmd2->getCollectDate(); 
$distance = acos(sin($old_lat)*sin($latitude)+cos($old_lat)*cos($latitude)*cos($longitude-$old_long))*6378.137;
$cmd4 = cmd::byString("#[Essence][Distance et vitesse][Distance]#");
$cmd4->event($distance);
$cmd2->event($longitude);
$cmd3->event($latitude);
$debut = strtotime($collectDate);
$fin = strtotime("Now"); 
$time = ($fin - $debut)/3600;
$vitesse = $distance/$time;
$cmd5 = cmd::byString("#[Essence][Distance et vitesse][Vitesse]#");
$cmd5->event($vitesse);

image

1 « J'aime »

Bonjour,
merci beaucoup pour le script.
Comment feriez-vous pour ajouter la notion ‹ en Eloignement › / ‹ en rapprochement › du domicile ?
Cela pourra servir à remettre le chauffage avant le retour

dans mon script, il faudrait ajouter la distance au domicile et pas seulement la distance entre les deux mises à jour de position.
ensuite, si ça diminue alors on pourrait dire que c’est en rapprochement. seul problème : ceux qui traversent la france d’est en ouest ou du nord au sud sans rentrer chez eux pendant les vacances :wink:

Il suffit d’historiser la distance au domicile, et ensuite d’utiliser la fonciton tendance

  • -1 : la distance diminue
  • 0 : la distance est constante
  • 1 : la distance augmente

Cette commande peut directement est mise dans le virtuel

tendance(commande,période,seuil) : Donne la tendance de la commande sur la période (period=[month,day,hour,min] ou expression PHP).

ex :

tendance(<distance au domicile>, 10 minutes, 1)

Signifie : Si la distance au domicile augmente (1) ou diminue (-1) d’autres moins 1km dans les 10 dernieres minutes

Norbert