Page 8 sur 18

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 14:03
par gloupy31
Merci Neutrino !

j'ai corrigé mon erreur et le terminal affiche les bonnes données !! Par contre le capteur virtuel ne se met pas à jour ... J'ai pourtant bien déclaré l'idx du capteur dans le script time. une idée ??


---------------------------------
-- Script de collecte de quelques indicateurs solaire
-- Auteur : Sébastien Joly
-- Adapté pour Domoticz par Neutrino
-- Date : 29 août 2015
-- Eléments de calculs :
-- http://www.plevenon-meteo.info/techniqu ... ement.html
-- http://herve.silve.pagesperso-orange.fr/solaire.htm
-- http://www.domotique-info.fr/2015/09/ou ... ecenter-2/
---------------------------------

--Variables à éditer--------------
local idxLux = '240' --Capteur virtuel de Luminosité
--------------------------------

commandArray = {}

time = os.date("*t")


if ((time.min % 5)==0) then
if (timeofday['Nighttime']) then
--il fait nuit
LuxPondere = 0
--mise à jour du dispositif
commandArray[1] = {['UpdateDevice'] = idxLux..'|0|' .. tostring(LuxPondere)}
else

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 15:38
par Neutrino
Tu l'as modifier dans soleil.lua aussi ?

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 15:59
par fabd
c'est chez moi ou impossible de sauvegarder le script ?

J'ai fait un bete CTRL C CTRL V, puis SAVE

et il ne sauvegarde pas.

Je supprime tout le contenu, puis SAVE, ca sauvegarde

Je remet le code, ca ne sauvergarde pas :o) (aucun message, aucune action se passe)

sous FF ou IE

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 16:14
par gloupy31
Neutrino a écrit :Tu l'as modifier dans soleil.lua aussi ?

Hélas oui : j'ai fait les modifs sur les variables comme ci dessous :

--Variables à éditer--------------
local Ville = "Toulouse" --Ville de référence
local idxLux = '240' --Capteur virtuel de Luminosité
local idxOcta = '0' -- idx de la variable Utilisateur
local wuAPIkey = "44e093d0a5161cb0"
local DEBUG = 'OUI'

si je fais un test avec Json à 5, ça se met à jour mais ensuite plus rien !!

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 16:36
par Neutrino

Code : Tout sélectionner

local idxOcta = '0' -- idx de la variable Utilisateur
ça, c'est pas normal, l'idx d'une variable utilisateur est forcément supérieur à 0
tu l'a bien créée et initialisée ?

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 17:03
par gloupy31
Neutrino a écrit :

Code : Tout sélectionner

local idxOcta = '0' -- idx de la variable Utilisateur
ça, c'est pas normal, l'idx d'une variable utilisateur est forcément supérieur à 0
tu l'a bien créée et initialisée ?

Exact , je viens de remplacer l'idx du script par 1 et la variable se met à à l'heure tous les 5 mn mais toujours rien au niveau du capteur virtuel !

Je l'ai crée avec la valeur 0 et elle est passée toute seule à 7 !

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 17:11
par Neutrino
Si tu relances lua soleil.lua, ça renvoie quoi ?

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 17:13
par gloupy31
Neutrino a écrit :Si tu relances lua soleil.lua, ça renvoie quoi ?
ça renvoie cette trame !

pi@raspberrypi:~/domoticz/scripts/lua $ lua soleil.lua
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2536 100 2536 0 0 5364 0 --:--:-- --:--:-- --:--:-- 5361
=====================================
2016-08-01 17:12:33
Toulouse, 43.63000107, 1.37000000
Altitude = 153.00000000 m
NiemeJourDeLAnnee = 214
2016 est bissextile.
Vitesse angulaire = 0.98562628336756 par jour
La déclinaison = 17.7060391081°
Temps universel decimal (UTC)15.2 H.dd
Temps solaire 15.291333333333 H.dd
Angle Horaire = -49.37°
Hauteur du soleil = 41.212207491181°
Azimut du soleil = 253.95771701708°
La durée d'insolation journalière = 14.36 H.dd
Radiation max en atmosphère = 1321.13 W/m²
Pression relative locale = 1021 hPa
Pression absolue atmosphère = 1002.6 hPa
Coefficient d'attenuation = 1.5440169485846
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 111 0 111 0 0 934 0 --:--:-- --:--:-- --:--:-- 940
Horodatage UTC = 201608011400
Station SYNOP = 07630
7 Octa
{
"status" : "OK",
"title" : "UpdateUserVariable"
}
Kc = 0.52369115797991
Radiation totale en lux pondéré = 34148.45 Lux
RadiationDirecte = 395.54 W/m²
Radiation Diffuse = 119.6 W/m²
Radiation totale = 515.14 W/m²
Radiation totale en lux = 65207.23 Lux
Le rayonnement solaire avec pondération = 269.77
pi@raspberrypi:~/domoticz/scripts/lua $

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 17:27
par Neutrino
gloupy31 a écrit :Radiation totale en lux pondéré = 34148.45 Lux
Donc, la valeur est bien calculée !
Poste ton script en entier entre des balises 'code' stp.

Re: Luminosité théorique extérieure

Publié : 01 août 2016, 17:43
par gloupy31
Neutrino a écrit :
gloupy31 a écrit :Radiation totale en lux pondéré = 34148.45 Lux
Donc, la valeur est bien calculée !
Poste ton script en entier entre des balises 'code' stp.
Le voilà !! pourtant je n'ai fait qu'un copier/coller et juste modifié les variables et rentré mon adresse ip locale sur la fin du script :shock:

--Variables à éditer--------------
local Ville = "Toulouse" --Ville de référence
local idxLux = '240' --Capteur virtuel de Luminosité
local idxOcta = '1' -- idx de la variable Utilisateur
local wuAPIkey = "44e093d0a5161cb0"
local DEBUG = 'OUI'

--import des fontions pour lire le JSON
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()

-- Fonction déterminant si année bissextile
function AnneeBissextile(annee)
return annee%4==0 and (annee%100~=0 or annee%400==0)
end

---------------------------------
-- Fonction spliter
function split(s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result;
end


---------------------------------
-- Fonction Arrondir
function arrondir(num, dec)
if num == 0 then
return 0
else
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end
end

---------------------------------
-- Procedure principale
---------------------------------

---------------------------------
-- Meteo API Wunderground
local config=assert(io.popen('curl http://api.wunderground.com/api/'..wuAP ... le..'.json'))
local location = config:read('*all')
config:close()
local jsonLocation = json:decode(location)

local Latitude = jsonLocation.current_observation.display_location.latitude
local Longitude = jsonLocation.current_observation.display_location.longitude
local Altitude = jsonLocation.current_observation.display_location.elevation
PressionRelative = jsonLocation.current_observation.pressure_mb

----------------------------------
local An = os.date("%Y")
local NiemeJourDeLAnnee = os.date("%j")
---------------------------------
DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time())
-- Début debug
if( DEBUG == 'OUI') then
print("=====================================")
print(os.date("%Y-%m-%d %H:%M:%S", os.time()))
print(Ville .. ", " .. Latitude .. ", " .. Longitude)
print("Altitude = " .. tostring(Altitude) .. " m")
print("NiemeJourDeLAnnee = " .. NiemeJourDeLAnnee)
end
---------------------------------
--calcul de l'année bissextile
if AnneeBissextile(An) == true then
if( DEBUG == 'OUI') then
print( An .. " est bissextile.")
end
JourDansLAnnee = 366
else
if( DEBUG == 'OUI') then
print( An .. " n'est pas bissextile.")
end
JourDansLAnnee = 365
end
---------------------------------
-- Vitesse angulaire = Combien de degrés par jour
VitesseAngulaire = 360/365.25 ----JourDansLAnnee -- ou approximativement 365.25
if( DEBUG == 'OUI') then
print("Vitesse angulaire = " .. VitesseAngulaire .. " par jour")
end
---------------------------------
-- Formule Declinaison = ArcSin(0,3978 x Sin(Va x (j - (81 - 2 x Sin(Va� x (j - 2))))))
local Declinaison = math.deg(math.asin(0.3978 * math.sin(math.rad(VitesseAngulaire) *(NiemeJourDeLAnnee - (81 - 2 * math.sin((math.rad(VitesseAngulaire) * (NiemeJourDeLAnnee - 2))))))))
if( DEBUG == 'OUI') then
print("La déclinaison = " .. Declinaison .. "°")
end
---------------------------------
-- Temps universel décimal (UTC)
TempsDecimal = (os.date("!%H") + os.date("!%M") / 60)
if( DEBUG == 'OUI') then
print("Temps universel decimal (UTC)".. TempsDecimal .." H.dd")
end
---------------------------------
-- Temps solaire
HeureSolaire = TempsDecimal + (4 * Longitude / 60 )
if( DEBUG == 'OUI') then
print("Temps solaire ".. HeureSolaire .." H.dd")
end
---------------------------------
-- Angle horaire du soleil
AngleHoraire = 15 * ( 12 - HeureSolaire )
if( DEBUG == 'OUI') then
print("Angle Horaire = ".. AngleHoraire .. "°")
end
---------------------------------
-- La hauteur du soleil (Elévation ou altitude)
HauteurSoleil = math.deg(math.asin(math.sin(math.rad(Latitude))* math.sin(math.rad(Declinaison)) + math.cos(math.rad(Latitude)) * math.cos(math.rad(Declinaison)) * math.cos(math.rad(AngleHoraire))))
if( DEBUG == 'OUI') then
print("Hauteur du soleil = " .. HauteurSoleil .. "°")
end
local Azimut = math.acos((math.sin(math.rad(Declinaison)) - math.sin(math.rad(Latitude)) * math.sin(math.rad(HauteurSoleil))) / (math.cos(math.rad(Latitude)) * math.cos(math.rad(HauteurSoleil) ))) * 180 / math.pi
local SinAzimut = (math.cos(math.rad(Declinaison)) * math.sin(math.rad(AngleHoraire))) / math.cos(math.rad(HauteurSoleil))
if(SinAzimut<0) then
Azimut=360-Azimut
end
if( DEBUG == 'OUI') then
print("Azimut du soleil = " .. Azimut .. "°")
end
---------------------------------
-- La durée d'insolation journalière - non stockée en VG
DureeInsolation = math.deg(2/15 * math.acos(- math.tan(math.rad(Latitude)) * math.tan(math.rad(Declinaison))))
DureeInsolation = arrondir(DureeInsolation,2)
if( DEBUG == 'OUI') then
print("La durée d'insolation journalière = " .. DureeInsolation .." H.dd")
end
---------------------------------
-- Constantes Solaire
ConstanteRatiationSolaire = 1361 -- W/m²
ConstanteRadiationLux = 200000 -- Lux
---------------------------------
-- Rayonnement solaire (en W/m²) présent à l'entrée de l'atmosphère.
RadiationAtm = ConstanteRatiationSolaire * (1 +0.034 * math.cos( math.rad( 360 * NiemeJourDeLAnnee / JourDansLAnnee )))
if( DEBUG == 'OUI') then
print("Radiation max en atmosphère = " .. arrondir(RadiationAtm,2) .. " W/m²")
end
---------------------------------
-- Coefficient d'attenuation M
PressionAbsolue = PressionRelative - arrondir((Altitude/ 8.3),1) -- hPa
SinusHauteurSoleil = math.sin(math.rad(HauteurSoleil))
M0 = math.sqrt(1229 + math.pow(614 * SinusHauteurSoleil,2)) - 614 * SinusHauteurSoleil
M = M0 * PressionRelative/PressionAbsolue
if( DEBUG == 'OUI') then
print("Pression relative locale = " .. PressionRelative .. " hPa")
print("Pression absolue atmosphère = " .. PressionAbsolue .. " hPa")
print("Coefficient d'attenuation = " .. M )
end
---------------------------------
-- Récupérer message SYNOP sur le site Ogimet
heureUTCmoins1 = os.date("!%H")-1
if string.len(heureUTCmoins1) == 1 then
heureUTCmoins1 = "0" .. heureUTCmoins1
end
UTC = os.date("%Y%m%d").. heureUTCmoins1.."00" -- os.date("!%M")
local WMOID = jsonLocation.current_observation.display_location.wmo
local ogimet=assert(io.popen('curl "http://www.ogimet.com/cgi-bin/getsynop? ... gin='..UTC..'"'))
local synop = ogimet:read('*all')
ogimet:close()
rslt = split(synop,",")
CodeStation = rslt[1]
rslt = split(synop, " "..CodeStation.. " ")
Trame = string.gsub(rslt[2], "=", "")
Trame = CodeStation .." ".. Trame
rslt = split(Trame, " ")
if( DEBUG == 'OUI') then
print("Horodatage UTC = " .. UTC)
print("Station SYNOP = " .. WMOID)
end
---------------------------------
-- Récupérer le premier caractere du 3eme mot = Nebulosité en Octa
Octa = string.sub(rslt[3], 1, 1)
--print(rslt[3])
-- 0 Pas de couverture nuageuse
-- 1-8 Huitième
-- 9 Brouillard
-- / Couverture indiscernable
-- cas particulier si valeur indéterminé un slash est renvoyé.
if Octa == "/" then
-- si la couverture est indiscernable, on reprend l'ancienne valeur
-- cela evite les violentes cassures dans la courbe
--Octa = uservariables['octa']
Octa = arg[1]
elseif Octa == "9" then
Octa = 8
end
if( DEBUG == 'OUI') then
print( Octa .. " Octa")
end
-- stockage de la variable octa
--commandArray['Variable:octa']=tostring(Octa)
os.execute('/usr/bin/curl "http://192.168.16.43:8080/json.htm?type ... ring(Octa)..'"')


---------------------------------
-- Facteur d'atténuation des couches nuageuses Kc
-- Kc=1-(0.75*((OCTA)**(3.4))
Kc=1-0.75*(math.pow(Octa/8,3.4))
if( DEBUG == 'OUI') then
print("Kc = " .. Kc)
end
---------------------------------
-- Au lever/coucher du soleil, on atteind les limites de précisions de ces calculs.
-- J'interrompts donc le calcul de radiation dès 1°.
if HauteurSoleil > 1 then
-- Radiation directe
RadiationDirecte = RadiationAtm * math.pow(0.6,M) * SinusHauteurSoleil
-- Radiation Diffuse
RadiationDiffuse = RadiationAtm * (0.271 - 0.294 * math.pow(0.6,M)) * SinusHauteurSoleil
-- Radiation totale
RadiationTotale = RadiationDiffuse + RadiationDirecte
-- Radiation en Lux : -- 1 Lux = 0,0079 W/m²
Lux = RadiationTotale / 0.0079
--Lux = ConstanteRadiationLux / ConstanteRatiationSolaire * RadiationTotale
-- Le rayonnement solaire avec ciel nuageux
RTOTC = RadiationTotale * Kc
-- Radiation en Lux pondéré
-- LuxPondere = ConstanteRadiationLux / ConstanteRatiationSolaire * RTOTC
LuxPondere = RTOTC / 0.0079
print("Radiation totale en lux pondéré = ".. arrondir(LuxPondere,2).." Lux")
if( DEBUG == 'OUI') then
print("RadiationDirecte = ".. arrondir(RadiationDirecte,2) .." W/m²")
print("Radiation Diffuse = ".. arrondir(RadiationDiffuse,2) .." W/m²")
print("Radiation totale = " .. arrondir(RadiationTotale,2) .." W/m²")
print("Radiation totale en lux = ".. arrondir(Lux,2).." Lux")
print("Le rayonnement solaire avec pondération = " .. arrondir(RTOTC,2))
end
else
--le soleil est trop bas
RTOTC = 0
LuxPondere = 0
end
--mise à jour du dispositif
os.execute('/usr/bin/curl "http://192.168.16.43/json.htm?type=comm ... uxPondere)..' -s -o /dev/null')