,
Suite à la modification de l'url pour la vigilance Météo, je me suis penché sur le sujet et je vous propose une nouvelle version à adapter en fonction des informations souhaitées.
Aller sur le site de météo France https://portail-api.meteofrance.fr/devportal/apis et créer un compte.
une fois fait dans la barre de recherche des API taper: vigilance et la vue de l'API pour la vigilance météo apparait.
Sélectionnez là et sélectionner "subscription" sur la gauche et donner un nom d'application pour votre projet.
Une fois fait vous pouvez configurer votre API.
Voir ci dessous: ensuite réaliser l'opération suivante: Dans un éditeur de texte faire un coller de la copie d’un des 2 choix possibles et récupérer le code après « Authorization :Basic », ne pas prendre les ‘’
le code obenu sera à mettre dans "local cleAPI" au début du script.
Ci dessous le code du script en dzvents
Code : Tout sélectionner
-- Récuperation informations Vigilance météo sur Météo France.
-- Site pour documentation: https://portail-api.meteofrance.fr/web/fr/api/DonneesPubliquesVigilance
-- Script: script_time_Vigilance_meteo
-- Version 2023-12-30
local scriptName = 'script_time_Vigilance_meteo'
local scriptVersion = '1.0'
local cleAPI = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- à générer sur le site https://portail-api.meteofrance.fr/devportal/apis
local urlVigilanceMeteo = 'https://public-api.meteofrance.fr/public/DPVigilance/v1/textesvigilance/encours' --- fichier JSON bulletin de Vigilance, de niveau national, zonal et départemental
local alert_device = 'Vigilance Météo 78' -- nom du device Alerte à créer avant l'exécution du script.
local Risk_code = 1 -- Valeur par défaut (vert - pas de vigilance)
local Hazard_name = "Pas de vigilance" -- valeur par défaut
local Dept = "78" -- Département pour l'affichage de la vigilance ou les diférentes zones, récuperer la documentation (pdf) sur la page de l'API ou lire le fichier récupéré (sur linux sous \domoticz\scripts\dzvents\data) pour comprende les données.
local DomaineID = ""
local Domaine_local = ""
local BlocID = nil
local message = {}
message[1] = "msg1"
message[2] = "msg2"
message[3] = "msg3"
message[4] = "msg4"
message[5] = "msg5"
message[6] = "msg6"
message[7] = "msg7"
local Message = {}
Message[1] = "Msg1"
Message[2] = "Msg2"
Message[3] = "Msg3"
Message[4] = "Msg4"
Message[5] = "Msg5"
Message[6] = "Msg6"
Message[7] = "Msg7"
local msg = ""
local Msg = ""
return {
on = { timer = { 'at 06:00-19:30 at *:13' },
httpResponses = { scriptName..'01', scriptName..'02' } -- must match with the callback passed to the openURL command
},
logging = { -- level = domoticz.LOG_DEBUG,
-- level = domoticz.LOG_INFO, -- Seulement un niveau peut être actif; commenter les autres
level = domoticz.LOG_ERROR, -- Only one level can be active; comment others
-- level = domoticz.LOG_MODULE_EXEC_INFO,
marker = scriptName..' v'..scriptVersion },
data = { access_token = { history = true, maxItems = 1, maxMinutes = 60 },
JsonFile = {initial = {} }
},
execute = function(domoticz, item)
if item.isTimer then
if domoticz.data.access_token.size == 0 or domoticz.data.access_token.get(1).time.minutesAgo > 50 then
url = "https://portail-api.meteofrance.fr/token"
domoticz.log('Requesting data from meteofrance', domoticz.LOG_DEBUG)
domoticz.openURL({
url = url,
method = 'POST',
headers = { ['Content-Type'] = 'application/x-www-form-urlencoded',
['Authorization'] = 'Basic '..cleAPI},
callback = scriptName..'01',
})
else
domoticz.log('access_token age: '..domoticz.data.access_token.get(1).time.secondsAgo, domoticz.LOG_DEBUG)
domoticz.log('access_token : '..domoticz.data.access_token.get(1).data, domoticz.LOG_DEBUG)
url = urlVigilanceMeteo
domoticz.log('Requesting data from meteofrance', domoticz.LOG_DEBUG)
domoticz.openURL({
url = url,
method = 'GET',
headers = { ['Content-Type'] = 'application/json;charset=utf-8',
['Accept'] = 'application/json',
['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
callback = scriptName..'02',
})
end
elseif (item.isHTTPResponse and item.ok) then
if item.trigger == scriptName..'01' then
contents = domoticz.utils.fromJSON(item.data)
domoticz.data.access_token.add(contents.access_token)
domoticz.log('access_token : '..domoticz.data.access_token.getLatest().data, domoticz.LOG_DEBUG)
domoticz.log('access_token age: '..domoticz.data.access_token.get(1).time.secondsAgo, domoticz.LOG_DEBUG)
url = urlVigilanceMeteo
domoticz.log('Requesting data from meteofrance', domoticz.LOG_DEBUG)
domoticz.openURL({
url = url,
method = 'GET',
headers = { ['Content-Type'] = 'application/json;charset=utf-8',
['Accept'] = 'application/json',
['Authorization'] = 'Bearer '..domoticz.data.access_token.get(1).data},
callback = scriptName..'02',
})
elseif item.trigger == scriptName..'02' then
devAlert = domoticz.devices(alert_device)
contents = domoticz.utils.fromJSON(item.data)
if #item.data > 0 then
domoticz.data.JsonFile = domoticz.utils.fromJSON(item.data)
rt = domoticz.utils.fromJSON(item.data)
else
domoticz.log("Problem with response from Meteo France (no data) using data from earlier run",domoticz.LOG_ERROR)
rt = domoticz.data.JsonFile -- json empty. Get last valid from domoticz.data
if #rt < 1 then -- No valid data in domoticz.data either
domoticz.log("No previous data. are Meteo France OK?",domoticz.LOG_ERROR)
end
end
Warning_type = contents.product.warning_type
Update_time = contents.product.update_time
local h = 1
while contents.product.text_bloc_items[h] do -- Boucle pour lecture de tous les blocs avec récupération du bloc ID du Département choisi.
DomaineID = contents.product.text_bloc_items[h].domain_id
if DomaineID == Dept then
BlocID = h
print("BlocID: "..BlocID.."<br>".."Domaine Name: "..contents.product.text_bloc_items[BlocID].domain_name)
break
end
h = h + 1
end
Domaine_local = contents.product.text_bloc_items[BlocID]
local i = 1 -- Boucle pour lecture en cas de plusieurs items.
while Domaine_local.bloc_items[i] do
Type_group = Domaine_local.bloc_items[i].type_group
Type_name = Domaine_local.bloc_items[i].type_name
Hazard_name = Domaine_local.bloc_items[i].text_items[1].hazard_name
Domain_name = Domaine_local.domain_name
if Domaine_local.bloc_items[i].text_items[1].term_items[1] then
Detail_Vigi = Domaine_local.bloc_items[i].text_items[1].term_items[1]
Term_names = Detail_Vigi.term_names
Start_time = Detail_Vigi.start_time
End_time = Detail_Vigi.end_time
Risk_name = Detail_Vigi.risk_name
Risk_code = tonumber(Detail_Vigi.risk_code)
Vigi_Text = ""
if Detail_Vigi.subdivision_text[1] then
local j = 1
while Detail_Vigi.subdivision_text[1].text[j] do
if string.len(Detail_Vigi.subdivision_text[1].text[j]) > 0 then
Vigi_Text = Vigi_Text..Detail_Vigi.subdivision_text[1].text[j].."<br>"
end
j = j + 1
end
end
if i == 1 then
msg = "Date publication: "..Update_time.."<br>".."Département: "..Domain_name.."<br>".."<br>".."===========================================================================".."<br>"
end
message[i] = "Type d'alerte: "..Type_name.."<br>".."Début phénomène: "..Start_time.."<br>".."Fin phénomène: "..End_time.."<br>".."Risque: "..Risk_name.."<br>".."<br>".."Message: "..Vigi_Text.."<br>".."===========================================================================".."<br>"
Message[i] = Type_name..":"..Hazard_name.."<br>"
msg = msg..message[i]
Msg = Msg..Message[i]
else
-- Pas de Vigilance
Msg = "Pas de Vigilance"
msg = "Pas de Vigilance"
end
i = i + 1
end
--Mise à jour du niveau d'alerte
if alert_device ~= nil then
if Risk_code == 0 or Risk_code == nil then
Alerte = domoticz.ALERTLEVEL_GREY
elseif Risk_code == 1 then
Alerte = domoticz.ALERTLEVEL_GREEN -- Pas de Vigilance
Msg = "Pas de Vigilance"
msg = "Pas de Vigilance"
elseif Risk_code == 2 then
Alerte = domoticz.ALERTLEVEL_YELLOW
elseif Risk_code == 3 then
Alerte = domoticz.ALERTLEVEL_ORANGE
elseif Risk_code == 4 then
Alerte = domoticz.ALERTLEVEL_RED
end
if devAlert.color ~= Risk_code or devAlert.text ~= Msg then
devAlert.updateAlertSensor(Alerte, Msg)
if Risk_code >= 1 then
domoticz.notify("Vigilance Météo 78 : ", msg, domoticz.PRIORITY_EMERGENCY)
end
elseif devAlert.lastUpdate.minutesAgo > 60 then
devAlert.updateAlertSensor(Alerte, Msg)
end
end
end
else
domoticz.log('Last http response was not what expected. Trigger: '..item.trigger, domoticz.LOG_ERROR)
domoticz.log(item.data, domoticz.LOG_ERROR)
end
end
}
local Dept = "xx"
Et bien sure créer un widget Alerte.
Je n'ai pas utilisé tous les champs possibles founis pas Météo france, je pense avoir pris les plus importants. Libre à vous de choisir d'autre champs.
en cas d'alerte un mail est envoyé si une adresse est configurée dans domoticz, les informations ne sont pas toujours précises dans la partie texte mise dans l'alerte.
Pour tester il suffit de lancer une fois le script et lire le fichier dans \domoticz\scripts\dzvents\data\xxx.lua et selectionner un département ou une zone ayant une alerte météo.
Je n'ai fait que la partie alerte en texte, c'est est aussi possible en mode carte mais plutot utilisable dans monitor.
Exemple de mail envoyé;
Et le résultat sur le Widget Vigilance Météo CordialementDate publication: 2024-01-16T07:12:43Z
Département: Yvelines
===========================================================================
Type d'alerte: Situation Actuelle
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange
Message: Faits nouveaux : passage en vigilance orange neige-verglas à partir de la fin de soirée.
Situation générale : Dans des températures froides, arrivée en fin de soirée par le sud d'une perturbation active avec pluies verglaçantes en seconde partie nuit prochaine, parfois précédés de quelques flocons.
Observations notables : ras pour l'instant.
===========================================================================
Type d'alerte: Prévisibilité et incertitudes
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange
Message: - chronologie pouvant varier d'une heure.
- neige faible possible en milieu de nuit, précédant l'arrivée des pluies en surfusion sur sols froids.
===========================================================================
Type d'alerte: Qualification
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange
Message: Episode notable de pluies verglaçantes pouvant rendre les conditions de circulation difficiles, suivi d'un épisode neigeux.
===========================================================================
Type d'alerte: Évolution prévue
Début phénomène: 2024-01-16T07:00:00Z
Fin phénomène: 2024-01-18T23:00:00Z
Risque: Orange
Message: Début des flocons puis pluies verglaçantes vers 22 h ce soir mardi, qui gagnent l'ensemble de l'Ile-de-France du sud vers le nord.
Fin de pluies verglaçantes mercredi à l'aube, suivie de pluies en journée, cumuls notables.
A partir de la soirée mercredi, du nord vers le sud, chutes de neige qui gagnent l'ensemble de l'Ile-de-France et durent jusqu'à jeudi en matinée.
Fin prévue de l'épisode : matinée de jeudi.
===========================================================================
Alain