Aller au contenu
MAM78

HC2 Waze Calculator multi-itinéraires

Recommended Posts

Vous trouverez ci-dessous une version adaptée de Waze Calculator écrit à l'origine par @Krikroff cf. Lien : https://www.domotique-fibaro.fr/topic/6362-hc2-waze-calculator/

L'adaptation permet d'avoir de 1 à 3 itinéraires différents par trajet, avec les données suivantes :

  • Point de départ
  • Point d'arrivée
  • Heure de départ
  • De 1 à 3 (nouveautés) itinéraires avec les indications suivantes :
    • Temps de trajet
    • Horaire d'arrivée
    • Routes/Axes principaux de l'itinéraire
    • Indicateur (! Péage) (nouveautés) , si l'itinéraire passe par une voie à péage (afin de choisir son itinéraire toute connaissance de cause)

 

Cette fonctionnalité passe par le service de trafic et de navigation communautaire WAZE (https://www.waze.com/fr/). Exemple d'affichage :

Exemple VD.png

 

Le principe du script est très simple :

  • 1 scène pour interroger l’ API Waze pour tous les trajets paramétrés
  • autant de VD qui seront mis à jour par la scène indiquée ci-dessus

1 - Installation

Création VD.png

 

 

Création de la Scène.png

2 - Paramétrage

  • Comme indiqué précédemment, vous pouvez créer autant de trajets que vous souhaitez.
  • Au début du code de la Scène vous trouverez une déclaration de variable "params" dans laquelle vous aller définir :
    • modetrace (soit égale à true ou false) qui permet suivre dans le fenêtre de debug l'avancement du traitement avec des trajets et itinéraires
    • modedebug (soit égale à true ou false) qui permet suivre dans le fenêtre de debug l'avancement les étapes du traitement dans le code et les messages d'erreurs.
  • et pour chaque trajet les paramètres suivants :
    • nom du trajet (à titre indicatif)
    • id du vd cible (module virtuel cible qui va recevoir les résultats de la recherche des itinéraires pour le trajet)
    • Nom du point de départ (va remonter comme indication dans le VD), longitude et latitude
    • Nom du point d'arrivée (va remonter comme indication dans le VD), longitude et latitude

(Pour trouver les coordonnées GPS, latitude et longitude il existe les services : www.coordonnees-gps.fr, www.torop.net/coordonnees-gps.php, www.gpsfrance.net)

  • TimeOut (durée en millième de secondes, correspondant au temps nécessaire pour que la requête s'execute sur le site de Waze. A adapter selon les recherches)
  • pollingMS (intervalle d'interrogation du site Waze)
  • NbIti (nombre d'itinéraires que vous souhaitez remontés sur le VD, entre 1 et 3 maxi, il se peut que la scène remonte un nombre d'itinéraire inférieur au nombre que vous avez demandé. Ceci est dépendant de ce que le site de Waze génère comme itinéraires selon vos paramètres)

 

  • Dans l'exemple ci-dessous, il y a 3 trajets (Trajet 1 Aller, Trajet 2 Retour, Trajet Lille), qui remontes chacun 3 itinéraires qui vont mettre à jours 3 VD (157, 158, 159)
--------------------------------------------------------------------
-- USER DATA -------------------------------------------------------
--------------------------------------------------------------------

local modetrace = true
local modedebug = true
local params = {
  {
    name = "Trajet 1 Élysée -> Guignol",
    virtualDeviceId = 157,
    from = {
      name = "Palais de l'Élysée",
      x = 2.3167538999999806, -- longitude
      y = 48.8704156   -- latitude
    },
    to = {
      name = "Théâtre Guignol",
      x = 2.311747670173645, -- longitude
      y = 48.86977710077997 -- latitude
    },
    pollingMs = 1*60*1000,
    TimeOut = 5000,
    NbIti = 3
  },
  {
    name = "Trajet 1 Paris -> Strasbourg",
    virtualDeviceId = 158,
    from = {
      name = "Paris",
      x = 2.311747670173645, -- longitude
      y = 48.86977710077997 -- latitude
    },
    to = {
      name = "Strasbourg",
      x = 7.746523700000012, -- longitude
      y = 48.5830972   -- latitude
    },
    pollingMs = 1*60*1000,
    TimeOut = 7000,
    NbIti = 3
  },
  {
    name = "Trajet Paris -> Lille",
    virtualDeviceId = 159,
    from = {
      name = "Paris, 1 rue de Lille",
      x = 2.332467299999962, -- longitude
      y = 48.8576502  -- latitude
    },
    to = {
      name = "Lille, 1 rue de Paris",
      x = 3.0652202999999645, -- longitude
      y = 50.6368413 -- latitude
    },
    pollingMs = 1*60*1000,
    TimeOut = 7000,
    NbIti = 3
  }
}

3 - Si comme chez-moi votre MV plante avec un message du genre :

erreur.thumb.png.1f4dba47e5fdd23d29a1a3cc9fbd9e28.png

  • Il s'agit d'un un bug de l'API dans la HC2 (qui a déjà été signalé à Fibaro).
  • Je vous suggère de contourner l'erreur  :
    • Installer la scène WatchDog qui va relancer votre scène automatiquement. Elle est disponible ici :

https://www.domotique-fibaro.fr/topic/6472-watchdog-pour-scã¨nes-et-modules-virtuels/

  • Ajouter la ligne suivante dans la section User variables dans la déclaration de la variable watchlog
local watchdog = {
	{type = "Scene", id = 21, match = {text="", interval=0}, no_match = {text=""}, count=1, restart=true, notification = {}} -- Waze Calculator multi-itinéraires
}
  • Ajouter à votre code WatchDog la fonction Restart2 (de @Titof_44) ci-dessous juste avant la fonction Restart
--
-- function Restart2 de @Titos_44 qui permet de faire une stop/start pour relancer une scène qui a planté avec un message de type Error (en rouge)
--
function Restart2(type, id, restart, notification)
  	Message("blue", 'Restart2 '..type..'('..id..')')
	local httpClient = net.HTTPClient()
  	httpClient:request("http://127.0.0.1:11111/api/sceneControl?id="..id.."&action=stop")
	Message("green", type.."("..id..") successfully stop")
	fibaro:sleep(1000)
  	httpClient:request("http://127.0.0.1:11111/api/sceneControl?id="..id.."&action=start")
	Message("green", type.."("..id..") successfully restarted")
end
  • Ajout de l'appel de la fonction restant2 dans la fonction restart entre les 2 lignes (if restant and restant == true) et (--save VD/Scene) comme illustré ci-dessous :
if restart and restart == true then
    -- Ajout restart2 MAM78
    if type:lower() == "scene" then
	    Restart2(type, id, restart, notification)
    end
    -- Fin ajout restart2 MAM78
-- Save VD/Scene
  • Attention de bien paramétrer votre scène Waze Calculator itin avec (Max. running instances = 1) et  (Run scene = Manual)

58b372fce49ca_paramwaze.png.7dec7ce3d4efea48ecba528e1ea8ea91.png

 

4 - Icône

  • Modifier l'icône de vos VD et votre scène

waze.png

 

5 - Fichiers sources 

 

6 - Change Log :

  • 28/02/2017 : Ajout d'explications dans le Tuto : comment modifier la scène WatchDog pour y ajouter la fonction restart2 de @Titof_44
  • 27/02/2017 : Nouvelle version de la scène V1.1.5 - Désactivation des modes trace + quelques motifs de formes et indication comment contourner lors la scène bug. (voir ci-dessous au point 3)
  • 20/02/2017 : Nouvelle version de la scène V1.1.4 - Ajout d'un mode debug pour suivre l'avancement des étapes et des erreurs dans le traitement (cf. variable : modedebug )
  • 19/02/2017 : Nouvelle version de la scène V1.1.3 - Ajout d'un mode trace pour suivre l'execution du traitement (cf. variable : modetrace )
  • 19/02/2017 : Nouvelle version de la scène V1.1.2 - correction du message d'erreur LuaEnvironment: /opt/atlassian/bamboo-agent.. (peut-être ?) :15:
  • 18/02/2017 : Nouvelle version de la scène V1.1.1 - correction sur messages d'erreurs
  • 18/02/2017 : Nouvelle version du VD V1.1.1 - réduction du libellé des itinéraires pour laisser plus de place aux textes des itinéraires.

 

7 - Remerciements 

 

Modifié par MAM78
Nouvelle version de la scène - Ajout d'un mode trace
  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Super, a tester :-)
Belle adaptation du VD d un patron

Partager ce message


Lien à poster
Partager sur d’autres sites

oui bravo. J'avais le meme besoin mais pas réussi à faire en sorte qu'il évite le péage, donc l'alternative de calculer 3 itinéraires est top

 

Edit : j'ai mis la scene en route mais j'ai un 

[DEBUG] 08:41:06: parsing error

au debut, mais sans gêner l'executer de la scene

 

tu sais dire ?

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

un check toutes les 5mns serait suffisant à mon avis.

 

c'est le pooling qu'il faut modifier c'est ca ?

 

pollingMs = 5*60*1000

EDIT : ok, c'est bien ca. Peut être plus explicite sur le poste 1 , car au lieu de durée des traitements c'est plutôt intervalle d'interrogation du site waze

Donc c 'est tout bon, reste juste le "parsing error" au lancement pour être nickel.

 

 

merci encore

 

 

 

 

 

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

par moment ca bug - mais ca doit être à cause du site waze

 

[DEBUG] 11:00:56: Get data error = Operation canceled
[DEBUG] 11:01:09: Get data error = Operation canceled
[DEBUG] 11:01:22: Get data error = Bad file descriptor
[DEBUG] 11:01:35: Get data error = Operation canceled

 

Partager ce message


Lien à poster
Partager sur d’autres sites

ouch merchant bug là

 

[ERROR] 14:54:17: LuaEnvironment: /opt/atlassian/bamboo-agent/xml-data/build-dir/HC-LE99-JOB1/LuaEngine/vendor/avhttp/avhttp/impl/http_stream.ipp:2247: void avhttp::http_stream::handle_skip_crlf(const MutableBufferSequence&, Handler, boost::shared_array, const boost::system::error_code&, std::size_t) [with MutableBufferSequence = boost::asio::mutable_buffers_1; Handler = boost::function; std::size_t = unsigned int]: Assertion `crlf[0] == '\r' && crlf[1] == '\n'' failed.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Effectivement, j'avais également quelques erreurs dans les logs.

 

Concernant les erreurs : 

  • parsing error, il s'agit d'erreur code p.status 503 ou 500 donc liée à une indisponibilité du serveur Waze.
    • J'ai mis un message plus explicite "Erreur d'indisponibilité du serveur Waze"
  • Get data error = Operation canceled et Get data error = Bad file descriptor, il s'agit d'une anomalie sur la fonction de traitement des erreurs.
    • Un repositionnement de la fonction semble avoir corrigé les erreurs.

Modification du premier post sur la description de la variable "pollingMs". Il s'agit bien de l'intervalle d'interrogation du site waze.

 

@Sakkhho Merci pour tes commentaires et tests. Si tu veux je viens de déposer une nouvelle version de le scène qui devrait corriger une bonne partie des erreurs.

 

Voici la nouvelle version. Je dépose celle-ci également dans le premier post.

HC2 Waze Calculator Scene Itinéraire 3 V1.1.1.LUA

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai mis en place la nouvelle version, je te dirai

 

d'ailleurs ceci est inutile

if (fibaro:countScenes() > 1) then
  fibaro:abort()
end

maintenant on a le nb d'instance dans le parametrage des scenes

Partager ce message


Lien à poster
Partager sur d’autres sites

ca semble bugger autant, mais c'est message d'erreur

 

la scene ne s'est pas mis à jour depuis 19h15

Partager ce message


Lien à poster
Partager sur d’autres sites

la scene s'arrete chez toi aussi ?

mon watchdog tente de la relancer sans cesse

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui effectivement, je cherche d'où pourrait venir l'erreur :15:

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai ajouté dans la partie déclaration de variable USER DATA une variable que vous pouvez modifier, il s'agit de la variable :

  • modetrace (soit égale à true ou false) qui permet suivre dans le fenêtre de debug l'avancement du traitement avec des commentaires

Nouvelle version de la scène V1.1.3.

cf. fichier : HC2 Waze Calculator Scene Itinéraire 3 V1.1.3.LUA

Partager ce message


Lien à poster
Partager sur d’autres sites

toujours un méchant bug qui fait tout planter

 

[ERROR] 11:27:15: LuaEnvironment: /opt/atlassian/bamboo-agent/xml-data/build-dir/HC-LE99-JOB1/LuaEngine/vendor/avhttp/avhttp/impl/http_stream.ipp:2247: void avhttp::http_stream::handle_skip_crlf(const MutableBufferSequence&, Handler, boost::shared_array, const boost::system::error_code&, std::size_t) [with MutableBufferSequence = boost::asio::mutable_buffers_1; Handler = boost::function; std::size_t = unsigned int]: Assertion `crlf[0] == '\r' && crlf[1] == '\n'' failed.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

 

A l'aide des expert du forum ?

 

erreur.png

 

Est-ce l'un de vous pourrait me dire d'où pourrait provenir l'erreur ci-dessus. Elle est générée par l'instruction suivante ?

  http:request(query, {
      	options = {
        method = 'GET',
        headers = {["Content-Type"] = "application/json"},
        data = body},
      	success = function(p)

Est-ce qu'il est possible de detecter cette erreur sans que cela fasse planter la Scène ?

 

Je me pose la question suivante : cette instruction n'a pas de parenthèse et de crochet de fin tout de suite après celle-ci (idem que sur le code de @Krikroff) Cette parenthèse et crochet de fin arrive qu'après l'ensemble des instruction de traitement du résultat de la requête http. Est-ce normal ?

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai déjà remonté l'info à Fibaro pour correction dans une prochaine build... Sans rentrer dans les détails c'est en rapport avec la solution utilisée par Fibaro pour l'intégration continue...
Il y a selon moi encore des problèmes de stabilité avec les sockets :(


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

merci pour ton retour @Krikroff 

 

Ca ne vient donc pas du code de la scène ;)

 

Est-ce qu'il est possible soit :

  • de detecter cette erreur pour l'intercepter et éviter que cela fasse planter la Scène ?
  • de contourner celle-ci en codant la requête d'une autre façon ?

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai pas en tete que la scene de Krikroff plantait. tu as testé ?

mais j'ai supprimé cette scene car 1 itinéraire le matin c'est celui avec peage tout  le temps donc inutile

Partager ce message


Lien à poster
Partager sur d’autres sites

Idem pour moi, c'est bien pour ça que j'ai voulu faire cette adaptation ;)

 

Est-ce que l'utilisation de Watchdog permettait de contourner le PB le moment le problème afin que la scène soit relancée régulièrement ?

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens d'installer Watchdog et effectivement, j'ai le même problème que toi @Sakkhho

 

La scène est portant bien arrêtée et malgré l'indication suivante dans le débugueur de Watchdog :

[DEBUG] 20:27:12: Check : type=Scene id=18
[DEBUG] 20:27:12: Scene(18) 0 running instance
[DEBUG] 20:27:12: Restart Scene(18)
[DEBUG] 20:27:12: Scene(18) successfully restarted
[DEBUG] 20:27:12: Notification : Watchdog : Scene "Waze Calculator Itin" (18) a été redémarré

Elle ne redémarre pas :15:

 

Est-ce que tu aurais une idée d'où vient le problème ? @Lazer

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

Ca ressemble au bug de la sauvegarde des scènes, qui existe depuis la 4.100, déjà relevé pour la scène GEA.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, Lazer a dit :

Ca ressemble au bug de la sauvegarde des scènes, qui existe depuis la 4.100, déjà relevé pour la scène GEA.

T'aurais pas une idée pour corriger ou contourner le problème ?

 

Ca fais des heures que je recherche une solution et commence à tourner en rond.

 

C'est quoi le problème de la sauvegarde de scènes dans GEA ?

Partager ce message


Lien à poster
Partager sur d’autres sites

×