Page 17 sur 17

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 24 avr. 2023, 13:06
par cyberbob
@keros

sa fonctionne si je met cette ligne avec weather? au lieu de onecall? :

Code : Tout sélectionner

https://api.openweathermap.org/data/2.5/weather?q=Marcinelle,be&APPID=XXXXX&lang=fr&units=metric
j'ai en retour :

Code : Tout sélectionner

{"coord":{"lon":4.4439,"lat":50.3922},"weather":[{"id":804,"main":"Clouds","description":"couvert","icon":"04d"}],"base":"stations","main":{"temp":10.24,"feels_like":9.51,"temp_min":9.18,"temp_max":11.4,"pressure":1012,"humidity":84},"visibility":10000,"wind":{"speed":6.3,"deg":274,"gust":9.31},"clouds":{"all":94},"dt":1682334009,"sys":{"type":2,"id":2037465,"country":"BE","sunrise":1682310670,"sunset":1682362161},"timezone":7200,"id":2791726,"name":"Marcinelle","cod":200}
Je peu utilisé cette syntaxe ?
Par contre sur le site openweather il n'y a qu'un seul moyen d'obtenir la clé API, je ne vois pas de mode spécifique pour avoir la Onecall 2.5 ? Je vois même que c'est passé en version 3.0 et quelle a l'air d'être payante car il me renvoie sur une page pour effectuer un payement .. :idea:

Merci.

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 24 avr. 2023, 16:00
par patoche
@keros
Peut tu me donner un exemple de syntaxe de la ligne 165 avec les coordonnées, stp ?

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 24 avr. 2023, 20:43
par Keros
@cyberbob, si tu as un json, c'est que l'appel fonctionne. Regarde si tu as les infos que tu souhaites dedans.

Je ne pense pas que tu puisses obtenir de nouvelles clés pour l'ancienne API 2.5. À l'époque où j'ai fait ce tuto, l'arrêt de DarkSky n'était pas encore annoncé.
Je crois comprendre que les nouvelles API sont payantes quand tu dépasses un quota. En dessous, c'est gratuit. Mais ils veulent quand même ta CB pour te prélever si tu dépasses.

@Patoche, un exemple de syntaxe est dans la première page de ce tuto.

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 27 avr. 2023, 11:10
par patoche
Hello

Comme pour @cyberbop, bien que mon inscription OWM date de la semaine dernière, pas de retour avec onecall 3.0, mais ok, avec 2.5/weather, quand je mets dans un navigateur
{"coord":{"lon":-xx,"lat":xx},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10d"}],"base":"stations","main":{"temp":13.34,"feels_like":13.34,"temp_min":12.97,"temp_max":13.34,"pressure":1014,"humidity":100,"sea_level":1014,"grnd_level":1011},"visibility":4567,"wind":{"speed":3.94,"deg":134,"gust":8.66},"rain":{"1h":1.31},"clouds":{"all":100},"dt":1682586184,"sys":{"type":2,"id":2005646,"country":"FR","sunrise":1682571363,"sunset":1682622603},"timezone":7200,"id":2998404,"name":"xxx","cod":200}

J'ai bien modifié mes Id dans le script de Gilles, mais les dispositifs ne s'actualisent pas. Dans la trace j'ai ça.

2023-04-27 11:00:13.429 Status: dzVents: Info: Handling httpResponse-events for: "OWMcallback.

Des idées ?

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 01 mai 2023, 12:29
par rvyr
Bonjour Keros

désolé pour la réponse un peu tardive j'etais en vacances ;)

Avec un widget Temp+Hum+Baro j'ai le retour erreur suivant :

dzVents: Error: (3.0.2) -- OpenWeatherMap v1.0: No status provided. Temperature + humidity not set
Error: OpenWeatherMap: Error getting http data!

Bonne journée

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 01 mai 2023, 15:53
par Keros
Il semblerait qu'il te manque des infos. Vérifies que tu envoies bien toutes les infos en fonctions du type de widget https://www.domoticz.com/wiki/DzVents:_ ... _scripting

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 01 mai 2023, 18:53
par rvyr
OK. Réglé en supprimant et recréant OpenWeather dans matériel et réattribuant les idx des widgets !
Merci.

Petite question supplémentaire, je souhaiterais que dans le script de Gilles on puisse incorporer les probabilités de pluie à 1H/2H/24H ces données peuvent elles être récupérées ? et comment les traiter ?

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 01 mai 2023, 20:05
par Keros
Un script ne fait pas tout, c'est d'ailleurs pourquoi j'ai rédigé un tuto dans ce sujet pour expliquer comment récupérer les infos. Regarde les premières pages, c'est expliqué.

Gilles a partagé son script. Merci à Lui. Maintenant, c'est à toi de l'adapter en fonction de tes besoins.

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Publié : 14 mai 2023, 09:57
par Gilles_
L'accès gratuit à l'api 3.0 ne fonctionne plus depuis qq temps pour moi. Je suis donc repassé sur l'api 2.5 qui est malheureusement moins riche en informations.
voici mon petit code DzVents correspondant.
Je n'ai pas vérifié l'exactitude la partie pluie ou il faut peut etre revoir la partie sur le cumul.

Code : Tout sélectionner

--[[ ~/home/pi/domoticz/scripts/dzVents/scripts/OpenWeatherMap.lua

author : gso
MAJ : 15/04/2023
création : 24/03/2023
Principe : Version gratuite sans prépaiement (juste inscription gratuite pour récupérer la clé api)
https://api.openweathermap.org/data/2.5/weather?lat=48.8&lon=2.3&appid=[votre clé api]&units=metric&lang=fr

{"coord":{"lon":2.3,"lat":48.8},
"weather":[{"id":800,"main":"Clear","description":"ciel dégagé","icon":"01n"}],
"base":"stations",
"main":{"temp":13.67,"feels_like":12.69,"temp_min":10.32,"temp_max":14.65,"pressure":1020,"humidity":61},
"visibility":10000,
"wind":{"speed":3.6,"deg":110},
"rain":{"1h":0.25},
"clouds":{"all":0},
"dt":1681071766,
"sys":{"type":2,"id":2041230,"country":"FR","sunrise":1681017147,"sunset":1681065103},
"timezone":7200,"id":2988507,"name":"Paris","cod":200
}


apiKey = to get on https://openweathermap.org/api and set in domoticz.variables with name "apikey_openweathermap" or set it in the code
]]--

-- local 
local scriptName = 'OpenWeatherMap25'
local scriptVersion = '1.0'
local uri = 'https://api.openweathermap.org/data/2.5/weather'
local units = 'metric'
local lang = 'fr'
local rainCounter = 0

local devices = { -- devices idx (to be changed accordingly), dz update device function
    -- Temperature (°C if metric)
    -- {idx = 0, cde = function (dz, idx, v) dz.devices(idx).updateTempHum(v.current.temp, v.current.humidity, dz.HUM_COMPUTE) end },
    -- Dew Point (°C)
    -- {idx = 0,   cde = function (dz, idx, v) dz.devices(idx).updateTemperature(v.current.dew_point) end },
    
    -- Pressure
    {idx = 986, cde = function (dz, idx, v) dz.devices(idx).updatePressure(v.main.pressure) end }, -- pressure
    
    --THB
    {idx = 982, cde = function (dz, idx, v) 
        -- local pop = v.daily[2].pop -- probability of precipitation for tomorrow
        local clouds = v.clouds.all
        local baro = dz.BARO_NOINFO
        if v.rain ~= nil and v.rain['1h'] ~= nil then baro = dz.BARO_RAIN
        elseif clouds >= 75 then baro = dz.BARO_CLOUDY
        elseif clouds >= 25 then baro = dz.BARO_PARTLY_CLOUDY
        else baro = dz.BARO_SUNNY
        end
        dz.devices(idx).updateTempHumBaro(v.main.temp, v.main.humidity, dz.HUM_COMPUTE, v.main.pressure, baro) 
    end },
    
    -- Clouds (%)
    {idx = 977, cde = function (dz, idx, v) dz.devices(idx).updatePercentage(v.clouds.all) end },
    
    -- Visibility (km)
    {idx = 983, cde = function (dz, idx, v) dz.devices(idx).updateVisibility(v.visibility/1000) end },
    
    -- Wind
    {idx = 984, cde = function (dz, idx, v)
        if v.wind.gust == nil then v.wind.gust = v.wind.speed end
        degrees = v.wind.deg
        local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
        local quad = 'N'
        if degrees <= 348.75 and degrees > 11.25 then quad = quadrants[tonumber(math.floor((degrees - 11.25) / 22.5)+1)] end
        dz.devices(idx).updateWind(degrees, quad, v.wind.speed, v.wind.gust, v.main.temp, v.main.feels_like)-- bearing(°), direction(N S NNW..), speed(m/s), gust(m/s), temperature(°C), chill(°C)
    end },
    
    
    -- Rain (rate in mm * 100 per hour, counter is total in mm) : to be checked
    {idx = 985,  cde = function (dz, idx, v)
        if v.rain ~= nil and v.rain['1h'] ~= nil then
            rainCounter = rainCounter + v.rain['1h']/6 -- /6 because every 10mn
            dz.devices(idx).updateRain(v.rain['1h']*100, rainCounter)
        --elseif v.daily[1] ~= nil then dz.devices(idx).updateRain(0, v.daily[1].rain) 
        else dz.devices(idx).updateRain(0, rainCounter) end
    end }, 
    
    -- Snow
    {idx = 0, cde = function (dz, idx, v) 
        if v.snow ~= nil and v.snow['1h'] ~= nil  then dz.devices(idx).updateRain(v.snow['1h']*100, nill)
        -- elseif v.daily[1] ~= nil then dz.devices(idx).updateRain(0, v.daily[1].snow) 
        else dz.devices(idx).updateRain(0, 0) end
    end },

    -- Meteo
    {idx = 979,  cde = function (dz, idx, v)
        local txt = v.weather[1].description..' ('..v.weather[1].main..' - '..v.weather[1].id..')'
        dz.devices(idx).updateText(txt)
    end },
    
}


-- LOOP
return {

    active =  true, -- false,
    on = {
        timer           = { "every 10 minutes" },
        httpResponses   = { "OWM25callback" }, -- matches callback wildcard
    },

    -- data = {
    --    safedMessage = { history = true, maxItems = 100 , maxHours = 168 }
    -- },

    logging = {   
        level  =   domoticz.LOG_ERROR, domoticz.LOG_INFO, --, domoticz.LOG_DEBUG, domoticz.LOG_MODULE_EXEC_INFO
        marker = '-- '..scriptName..' v'..scriptVersion
    },

    -- EXEC
    execute = function(dz, triggerItem)
       
        local apiKey = dz.variables('apikey_openweathermap25').value
        
        local function errorMessage(message,notify)   -- Add entry to log and notify to all subsystems
            dz.log(message, dz.LOG_ERROR)
            if notify then
                -- dz.notify(message) -- notify(subject, message, priority, sound): Fonction. Envoi d’une notification (Prowl). La priorité sera choisie entre  domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY
            end
         end

        -- MAIN
        if triggerItem.isTimer then
            local pos = 'lat=' .. dz.settings.location.latitude .. "&lon=" .. dz.settings.location.longitude
            local url = uri .."?"..pos..'&appid='..apiKey..'&units='..units..'&lang='..lang
            -- errorMessage("DBG URL="..url)
            dz.openURL({
                url     = url,
                method  = "GET",
                callback= 'OWM25callback'
            }).afterSec(1)
        end

        if triggerItem.isHTTPResponse then
            if triggerItem.ok and triggerItem.isJSON then
                local resultsTable = triggerItem.json
                if resultsTable ~= nil and resultsTable.main ~= nil then
                    for k, d in ipairs(devices) do
                        if d['idx'] ~= 0 then d.cde(dz, d['idx'], resultsTable) end
                    end
                end
            else
                errorMessage("Problem with response from OWM", false)
            end
        end
    
    end --execute
}