Amélioration Geofencing

Jeedom Core : 4.3.15
Version JC : 1.8.0 stable
DNS Jeedom : non
Statut Démon : Démarré - (2023-08-14 10:08:11)

Equipements :
  PC Thomas : v1.8.0 stable sur android [os : 30] (ws) - PA
  Tablette : v1.8.0 stable sur android [os : 31] (ws) - PA
  Téléphone Sébastien : v1.8.0 stable sur android [os : 31] (ws) - PU
  Téléphone Thomas : v1.8.0 stable sur android [os : 33] (ws) - PA

Bonjour,

Si j’ai bien compris le fonctionnement, lorsque l’application mobile détecte une entrée/sortie de zone, elle envoie les coordonnées gps au plugin et c’est lui qui décide de valider ou non ces coordonnées suivant la précision de celles ci.
Et là c’est le drame (parfois) :slight_smile:. Si le plugin considère que les coordonnées ne sont pas suffisamment précise, le changement de zone ne se fait pas.

Pour améliorer ça, je propose que soit l’application envoie le changement de zone (maison=1, travail=0 …) au lieu des coordonnées gps, soit l’application n’envoie les coordonnées que si la précision de la mesure gps est suffisante (même si cela implique d’être notifié du changement plus tard).

Dans le dernier cas, ça permettrait aussi, en mode tracking, d’éviter d’envoyer des coordonnées gps rejetées par le plugin.

Merci :wink:

Bonsoir @tomdom

Sur de ce que tu dis ?
Pour moi tout ça est fait sur le téléphone mais le problème de précision est géré par l’OS sur le téléphone.
C’est justement différence entre geofencing et géotracking ou seul le binaire de présence dans la zone est remontée (pour le geofencing)

Norbert

1 « J'aime »

Bonsoir @ngrataloup

Oui.

  private static function setGeofence($eqLogic, $param) {
    $ts = array_key_exists('timestampMeta', $param) ? floor($param['timestampMeta']['systemTime'] / 1000) : strtotime($param['timestamp']);

    $activity = $param['activity']['type'];
    $accuracy = $param['coords']['accuracy'];
    if ($accuracy < 1000 || ($activity == 'in_vehicle' && $accuracy && $accuracy < 1000)) {
      $eqLogic->setCoordinates($param['coords']['latitude'], $param['coords']['longitude'], $param['coords']['altitude'], $param['activity']['type'], $param['battery']['level'] * 100, $ts);
    } else {
      JCLog::debug("[GeoLoc] data not saved, not accurate enough");
    }

    $activityCmd = $eqLogic->getCmd(null, 'activity');
    if (is_object($activityCmd)) {
      $activityCmd->event($param['activity']['type']);
    }

    if (array_key_exists('battery', $param)) {
      if ($param['battery']['level'] > -1) {
        $batteryCmd = $eqLogic->getCmd(null, 'battery');
        if (is_object($batteryCmd)) {
          $batteryCmd->event($param['battery']['level'] * 100, date('Y-m-d H:i:s', $ts));
        }
      }
    }
    return;
  }

Je ne vois pas où le calcul du geofence se fait dans la fonction indiquée.
Je comprends dans cette fonciton que ca enregistre lat/lon/altitude/activity/batterie si la precision est suffisante
Norbert

Si je me trompe @tomitomas ne manquera pas de le signaler
Je n’ai pas ouvert ce sujet pour lancer un débat mais juste faire part de ce que j’ai pu observer entre ma lecture des logs et du code.

Bonne soirée

Pas de souci et je confirme que @tomitomas sera le mieux placé

Norbert

Hello,

pourquoi moi ?? :slight_smile: :slight_smile:

@tomdom a raison, le code se fait dans une fonction fille de setCoordinates.
on est donc sur le bon point de départ.

à chaque entrée/sortie de zone l’app envoie les coordonnées dedans/hors zone au plugin qui ensuite :

  • fait le trie pour savoir si les infos sont suffisamment pertinente pour être prise en compte ou non → et du coup en effet il peut y avoir des loupés !
  • met à jour la position
  • met à jour la distance entre l’équipement et son Jeedom
  • met à jour la (ou les) zone(s) qui serai(ent) impactée(s) → car il peut y en avoir plusieurs

la proposition s’étudie en effet
je ne sais pas exactement ce que la librairie permet ou pas de faire.
à rediscuter avec @jared-94, mais je note la proposition sur la todo :wink:

2 « J'aime »

Bonjour,

Merci :slight_smile:
Je clos le poste

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.