Aller au contenu

Steven

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

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) :)

Lien vers le commentaire
Partager sur d’autres sites

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) :)

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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 :)

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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" 

 

Meteo Alerte Weather

Lien vers le commentaire
Partager sur d’autres sites

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 :)


Lien vers le commentaire
Partager sur d’autres sites

Merci Steven tu es toujours aussi rapide  ;)

 

Pour ce qui est de l'icone étant en PACA ...je n'ai besoin que celui là   :D ..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.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...