Steven Posté(e) le 10 juin 2014 Auteur Signaler Posté(e) le 10 juin 2014 Météo France ne fournit aucune information pour les privés, il a déjà fallu que je parcours leurs code pour trouver la référence de leur fichier XML (bien pourri d’ailleurs). En france, il y a plein de site d'alerte super intéressants : pollens.fr pour les allergiques, airparif.asso.fr pour la pollution ... aucun de ces sites ne fournit leurs données vers l'extérieur. Je posterais ce soir la mise à jour de ce module qui fonctionne correctement après un petit lifting du main loop. Edit : si vous recevez une alerte, aller regarder leur site, j'ai volontairement noté l'adresse sur le VD.
Domodial Posté(e) le 10 juin 2014 Signaler Posté(e) le 10 juin 2014 J'ai vu le site àl'époque de l'install du script. Le site est a laid Ca ne m'étonne pas que la récolte d'infos soit pareil en fait.. Merci pour la correction !
Steven Posté(e) le 11 juin 2014 Auteur Signaler Posté(e) le 11 juin 2014 Version 1.30 disponible Correction du soucis lié au Main Loop. Les recherches de Krikroff ont démontrés que le Main Loop n’accepte pas un sleep supérieur à40 minutes. Ce module a donc été changé pour effectuer des sleep de 30 minutes. Dans le Main Loop vous trouverez donc local nbHeure = 12 qui correspond au taux de rafraîchissement du module.Voici le code modifié si vous ne voulez pas tout réimporter ... flemmard ... (Si vous ne réimporté pas le module, pensez àchanger le numéro de version sous le bouton afin d'avoir le bon numéro en cas de demande de support.) local nbHeure = 12 local i = 0 while true do if (i >= (nbHeure*2) or i == 0) then i = 0 fibaro:call(fibaro:getSelfId(), "pressButton", "4") end fibaro:sleep(30*60*1000) i = i + 1 end
BenjyNet Posté(e) le 11 juin 2014 Signaler Posté(e) le 11 juin 2014 Mis àjour, il n'y a plus qu'àattendre les nouvelles balles de ping pong Merci Steven
tarentino Posté(e) le 11 juin 2014 Signaler Posté(e) le 11 juin 2014 Pour l'icône qui n'est pas prise en compte il faut aller sur le module virtuel puis avancé et changer l'icône du bouton N°8, ça marche à chaque fois 1
Fredric Posté(e) le 11 juin 2014 Signaler Posté(e) le 11 juin 2014 version 1.30 ok, en attente temps de M.... , mais je suis pas pressé
Steven Posté(e) le 11 juin 2014 Auteur Signaler Posté(e) le 11 juin 2014 Pour moi, il faudrait mieux une alerte UV pour les enfants
biboun Posté(e) le 11 juin 2014 Signaler Posté(e) le 11 juin 2014 Pour info, le service de google meteo arreté en 2012 a été pallié par un service privé gratuit ( 200 query max par jour je crois) http://www.previmeteo.com ils ont gardé la compatibilité parfaite avec ce que faisait google, donc tous ls tutos existants restent valables, et je pense que chacun y trouvera sa ville facilement. Perso je suis en train de me préparer un petit script externe sur raspberry pi qui saura "lire" la méteo en mode vocal ( tts)
Steven Posté(e) le 11 juin 2014 Auteur Signaler Posté(e) le 11 juin 2014 Pour la météo, il y a déjàun module existant sur ce site. Essai de regarder, tu dois pouvoir t'en inspirer car il est très complet. Ce que je voulais faire avec ce module, c'est les alertes météo de Météo France et non pas les informations d'un site américain qui sait même pas où est Paris (bon, moi non plus je sais pas où c'est ... mais c'est pas mon boulot)
biboun Posté(e) le 11 juin 2014 Signaler Posté(e) le 11 juin 2014 en effet le service que j'ai cité est orienté méteo et pas "alertres", en revanche c'est bien un service français, ils recuperent uniquement les données de base du NWS americain (j'imagine la position des flux de chaleur) et génerent eux meme les previsions avec leur modèles numériques sur leurs cartes. bref ça peut être interessant de comparer leurs prévisions à celle de météo france, d'autant que leur api est vraiment exploitable... et gratuite. quand tu vois qui utilise leur service: ( aeroport de paris, sncf), c 'est pas forcément un mauvais cheval...
lolomail Posté(e) le 11 juin 2014 Signaler Posté(e) le 11 juin 2014 Thx MAJ implémenté on verra la prochaine fois
Gwendal Posté(e) le 25 juillet 2014 Signaler Posté(e) le 25 juillet 2014 Excellent, merci pour Steven pour ton alerte météo c'est top Est ce que l'on peut rajouter une modification automatiquement de l’icône suivant le niveau d'alerte?
Steven Posté(e) le 25 juillet 2014 Auteur Signaler Posté(e) le 25 juillet 2014 Allez, je t'aide Remplace le code qui est derrière le bouton [Vérifier] par celui-ci : -- -------------------------------------------------------------------------------------------------------------- -- MeteoAlerte est est script qui va vérifier les alertes méteo du site vigilance.meteofrance.com -- Le site retournant des informations XML, le script va donc les parser. -- Author = "Steven Piccand" -- Version = "V1.30" -- V1.10 - Isolation des éventuelles erreurs -- V1.20 - Envoi possible sur plusieurs smartphones -- V1.30 - Correction problème Main Loop -- -------------------------------------------------------------------------------------------------------------- if (not MeteoAlerte) then MeteoAlerte = {} -- !!! VOS PARAMETRES !!! MeteoAlerte.dep = 74 -- votre département MeteoAlerte.smartphone = {70} -- {70,71} vos portables ou envoyé la notification push en cas d'alerte MeteoAlerte.niveauAlerte = 3 -- le niveau minimum d'alerte pour être notifié MeteoAlerte.globalvariable = "" -- Nom de la variable globale a renseigné -- -------------------------------------------------------------------------------------------------------------- -- Obtient le XML et le retourne sous forme de table LUA -- -------------------------------------------------------------------------------------------------------------- MeteoAlerte.getXml = function() local MeteoAlerteURL = Net.FHttp("vigilance.meteofrance.com"); response, status, errorCode = MeteoAlerteURL:GET("/data/NXFR34_LFPW_.xml"); return MeteoAlerte.iif(response ~= nil, MeteoAlerte.newParser().ParseXmlText(response), "") end -- -------------------------------------------------------------------------------------------------------------- -- Va chercher les valeurs du départements -- Modifie les valeurs des labels -- Envoi un push si nécessaire -- Met a jour une variable globale -- -------------------------------------------------------------------------------------------------------------- MeteoAlerte.getData = function() local messages = {"<inconnu>", "Aucune", "Attention", "", "Danger", "!! EXCEPTIONNEL !!"} local icones = {-1, -1, -1, -1, -1, -1} local result = 0 local crue = 0 local xmlTable = MeteoAlerte.getXml() if (xmlTable) then local evs = xmlTable.cartevigilance for i in pairs(evs:children()) do for j in pairs(evs:children()[i]) do if (evs:children()[i]:name() == "datavigilance") then for k in pairs(evs:children()[i]:properties()) do if (tonumber(evs:children()[i]["@dep"]) == MeteoAlerte.dep) then result = tonumber(evs:children()[i]["@couleur"]) fibaro:debug("Vigilance trouvée : " .. result) if (#evs:children()[i]:children() > 0) then crue = tonumber(evs:children()[i]:children()[1]["@valeur"]) fibaro:debug("Crue trouvéee : ".. crue) end end end end end end end fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblVigilance.value", messages[result+1]) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCrue.value", messages[crue+1]) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblUrl.value", "http://vigilance.meteofrance.com/") local icone_id = icones[math.max(result+1, crue+1)] if (icone_id > -1) then fibaro:debug("Icone " .. icone_id) fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone_id); end fibaro:log("Dernière mise à jour : " .. os.date("%c")) fibaro:debug("Vérification envoi par push") if (result >= MeteoAlerte.niveauAlerte or crue >= MeteoAlerte.niveauAlerte) then fibaro:debug("Envoi nécessaire") if (type(MeteoAlerte.smartphone) == "table") then for i = 1, #MeteoAlerte.smartphone do fibaro:call(MeteoAlerte.smartphone[i], "sendPush", "MeteoAlerte [".. MeteoAlerte.dep .." = " .. messages[result+1] .. "] | [crue = " .. messages[crue+1] .. "]") end end end if (result and MeteoAlerte.globalvariable and MeteoAlerte.globalvariable ~= "") then fibaro:setGlobal(MeteoAlerte.globalvariable, result) end return true end -- ------------------------------------------------------------------------------------------------------------- -- Teste la condition et retourne la valeur true ou false -- ------------------------------------------------------------------------------------------------------------- MeteoAlerte.iif = function(condition, iftrue, iffalse) if (condition) then return iftrue end return iffalse end -- ------------------------------------------------------------------------------------------------------------- -- Ceci est une version modifiée de Corona-XML-Module par Jonathan Beebe qui a son tour -- est basée sur Alexander Makeev's Lua-only XML parser . -- see https://github.com/Cluain/Lua-Simple-XML-Parser -- ------------------------------------------------------------------------------------------------------------- MeteoAlerte.newParser = function() parseXml = {} parseXml.FromXmlString = function(value) value = string.gsub(value, "([%x]+)%;", function(h) return string.char(tonumber(h, 16)) end); value = string.gsub(value, "([0-9]+)%;", function(h) return string.char(tonumber(h, 10)) end); value = string.gsub(value, "'", "'"); value = string.gsub(value, ">", ">"); value = string.gsub(value, "<", "<"); value = string.gsub(value, "&", "&"); return value; end parseXml.ParseArgs = function(node, s) string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a) node:addProperty(w, parseXml.FromXmlString(a)) end) end parseXml.ParseXmlText = function(xmlText) local stack = {} local top = parseXml.newNode() table.insert(stack, top) local ni, c, label, xarg, empty local i, j = 1, 1 while true do ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i) if not ni then break end local text = string.sub(xmlText, i, ni - 1); if not string.find(text, "^%s*$") then local lVal = (top:value() or "") .. parseXml.FromXmlString(text) stack[#stack]:setValue(lVal) end if empty == "/" then -- empty element tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) top:addChild(lNode) elseif c == "" then -- start tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) table.insert(stack, lNode) top = lNode else -- end tag local toclose = table.remove(stack) -- remove top top = stack[#stack] if #stack < 1 then error("XmlParser: nothing to close with " .. label) end if toclose:name() ~= label then error("XmlParser: trying to close " .. toclose.name .. " with " .. label) end top:addChild(toclose) end i = j + 1 end local text = string.sub(xmlText, i); if #stack > 1 then error("XmlParser: unclosed " .. stack[#stack]:name()) end return top end parseXml.newNode = function(name) local node = {} node.___value = nil node.___name = name node.___children = {} node.___props = {} function node:value() return self.___value end function node:setValue(val) self.___value = val end function node:name() return self.___name end function node:setName(name) self.___name = name end function node:children() return self.___children end function node:numChildren() return #self.___children end function node:addChild(child) if self[child:name()] ~= nil then if type(self[child:name()].name) == "function" then local tempTable = {} table.insert(tempTable, self[child:name()]) self[child:name()] = tempTable end table.insert(self[child:name()], child) else self[child:name()] = child end table.insert(self.___children, child) end function node:properties() return self.___props end function node:numProperties() return #self.___props end function node:addProperty(name, value) local lName = "@" .. name if self[lName] ~= nil then if type(self[lName]) == "string" then local tempTable = {} table.insert(tempTable, self[lName]) self[lName] = tempTable end table.insert(self[lName], value) else self[lName] = value end table.insert(self.___props, { name = name, value = self[name] }) end return node end return parseXml; end end -- ------------------------------------------------------------------------------------------------------------- -- Démarrage du script -- ------------------------------------------------------------------------------------------------------------- fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblVigilance.value", "...") fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCrue.value", "...") if (not pcall(function() MeteoAlerte.getData() end)) then local max_retry = 5 local i = 0 while (not stop) do fibaro:debug("Problème d'accès au données ... tentative dans 10mn") fibaro:sleep(10*60*1000) if (not pcall(function() MeteoAlerte.getData() end)) then i = i + 1 if (i >= max_retry) then stop = true end else stop = true end end end ..Ensuite ligne 40 : local icones = {-1, -1, -1, -1, -1, -1} Remplace les -1 par le numéro de tes icônes (de inconnu à exceptionnel). Si tu n'as pas d'icône laisse le -1. Si jamais cela ne fonctionnait pas, appel fredo 1
JM13 Posté(e) le 25 juillet 2014 Signaler Posté(e) le 25 juillet 2014 Steven, j'ai une petite question. local messages = {"<inconnu>", "Aucune", "Attention", "", "Danger", "!! EXCEPTIONNEL !!"} Pourquoi dans la variable ci-dessus, après le niveau "Attention" on a un niveau "vide". J'ai bien compris (je pense en partie ) le mécanisme d'affichage (messages[result+1]) mais dans mon cas, je suis obligé pour avoir une cohérence entre le code reçu et l'affichage du texte d'enlever ce niveau ! Sinon, j'ai des cas où je n'ai pas d'affichage ...alors que je pense qu'il est normal d'afficher "pas "alerte", non ? Sinon, j'avais aussi ajouté (de manière différente...mais ce n'est pas grave) aussi un icone "Ciel bleu"
Steven Posté(e) le 25 juillet 2014 Auteur Signaler Posté(e) le 25 juillet 2014 Je me suis posé la même question en rajoutant les icones ... je vais rechercher pourquoi j'avais fait cela mais il ce peux que cela soit une erreur de ma part
Steven Posté(e) le 25 juillet 2014 Auteur Signaler Posté(e) le 25 juillet 2014 Version 1.40 Correction du status relevé par JM13 Ajout de la possibilité de personnalisé l'icone selon le status en cours (demandé par Gwendal) Merci JM13 pour avoir pointé le problème. Si tu n'as pas d'affichage c'est que justement du est dans le mode "" qui aurait dà» être "danger". Attention, il faut relativisé l’appellation "danger" fournie par Météo France ;( Personnellement, je viens d'adopter ton icône Tu n'aurais pas la même mais avec beaucoup beaucoup de pluie ... cela correspondrait mieux à chez moi
JM13 Posté(e) le 25 juillet 2014 Signaler Posté(e) le 25 juillet 2014 Merci Steven tu es toujours aussi rapide Pour ce qui est de l'icone étant en PACA ...je n'ai besoin que celui là ..non plus sérieusement, je n'ai pas trouvé la famille de dégradé !! Sinon, mes sources c'est : http://www.icone-png.com/ http://www.pngfactory.net/ et je retaille en 128x128 quand c'est nécessaire. 1
Gwendal Posté(e) le 25 juillet 2014 Signaler Posté(e) le 25 juillet 2014 @ Steven Merci Je vais l'installer Si jamais cela ne fonctionnait pas, appel fredo Ok je le ferais avec plaisir lol 1
lolomail Posté(e) le 25 juillet 2014 Signaler Posté(e) le 25 juillet 2014 Steven tu peux poster juste le code de la V1.4? Merci
Gwendal Posté(e) le 25 juillet 2014 Signaler Posté(e) le 25 juillet 2014 Euh question, je voudrais mettre des icones mais comment fait-on ???
Steven Posté(e) le 25 juillet 2014 Auteur Signaler Posté(e) le 25 juillet 2014 @lolomail C'est le même que quelques post plus haut sauf qu'àla ligne 39 il faut enlever les "", juste avant "danger".
Steven Posté(e) le 25 juillet 2014 Auteur Signaler Posté(e) le 25 juillet 2014 @Gwendal Il y a une bonne explication ici FORUM FIBARO :: Search http://forum.fibaro.com/search.php?search_author=leon&sid=9cac8f29955ead11536902261289d7e0 1
Messages recommandés