Aller au contenu

Recommended Posts

Hello tout le monde !

 

Voici un QA permettant d'avoir l'azimut du soleil.

 

Un grand merci à l'auteur original du code cité dans le header du script du QA.

Je l'ai adapté pour mes besoins à savoir. Connaitre l'azimut du soleil, c'est tout.

Je me suis permis d'enlever les autres valeurs qui ne m'interraissaient pas vraiment.

 

Il s'agit d'un QA de type "Multilevel sensor".

Donc la valeur qu'il retourne est celle de l'azimut.

 

image.png.6acf2e9663408934af29371142f9bb15.png

 

Il utilise la localisation de la HC3, donc bien penser à la paramétrer dans les réglages.

 

Il faut saisir l'altitude : (ligne 41)

local Altitude = 310

 

J'ai créé un offset (self.offset) dans le code d'initialisation du QA afin d'avoir plus de précisions sur l'angle (étrangement constaté chez moi).

(ligne 15)

self.offset = -10

Dans mon cas, il est donc fixé à -10°... à vous de voir chez vous

 

---------------------------------
-- Script de collecte de quelques indicateurs solaire
-- Auteur : Sébastien Joly
-- Date : 29 août 2015
-- Eléments de calculs :
-- http://www.plevenon-meteo.info/technique/theorie/enso/ensoleillement.html
-- http://herve.silve.pagesperso-orange.fr/solaire.htm
-- adpaté par Jean-Jacques NEFF pour la HC3 le 24/03/2020
---------------------------------

function QuickApp:onInit()
    __TAG = "QA_"..plugin.mainDeviceId.."_Indicateur Solaire"
    self:debug("onInit")
    self.offset = -10
    self:Main()
end
  
---------------------------------
-- Fonction déterminant si année bissextile
---------------------------------
function QuickApp:AnneeBissextile(annee)
    return annee%4==0 and (annee%100~=0 or annee%400==0)
end

---------------------------------
-- Fonction Arrondir
---------------------------------
function QuickApp: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

local location = api.get("/settings/location")
local Ville = location.city
local Latitude = location.latitude
local Longitude = location.longitude
local Altitude = 310

---------------------------------
-- MAIN
---------------------------------
function QuickApp:Main()

    -- Début debug
    self:trace("=====================================")
    self:trace(os.date("%Y-%m-%d %H:%M:%S", os.time()))
    self:trace(Ville .. ", " .. Latitude .. ", " .. Longitude)
    self:trace("Altitude = " .. tostring(Altitude) .. " m")
      
    local NiemeJourDeLAnnee = os.date("%j")

    ---------------------------------
    -- Vitesse angulaire = Combien de degrés par jour
    ---------------------------------
    VitesseAngulaire = 360/365.25 ----JourDansLAnnee -- ou approximativement 365.25
    self:trace("Vitesse angulaire = " .. VitesseAngulaire .. " par jour")
    ---------------------------------
    -- 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))))))))
    self:trace("La déclinaison = " .. Declinaison .. "°")
    ---------------------------------
    -- Temps universel décimal (UTC)
    ---------------------------------
    TempsDecimal = (os.date("!%H") + os.date("!%M") / 60)
    self:trace("Temps universel decimal (UTC)".. TempsDecimal .." H.dd")
    ---------------------------------
    -- Temps solaire
    ---------------------------------
    HeureSolaire = TempsDecimal + (4 * Longitude / 60 )
    self:trace("Temps solaire ".. HeureSolaire .." H.dd")
    ---------------------------------
    -- Angle horaire du soleil
    ---------------------------------
    AngleHoraire = 15 * ( 12 - HeureSolaire )
    self:trace("Angle Horaire = ".. AngleHoraire .. "°")
    ---------------------------------
    -- 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))))
    self:trace("Hauteur du soleil = " .. HauteurSoleil .. "°")
    
    self:updateView("LBL_Hauteur", "text", "Hauteur = "..tostring(self:arrondir(HauteurSoleil,0)) .. "°")
    
    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
    self:trace("Azimut du soleil = " .. Azimut .. "°") --affichage sans offset
    
    self:updateView("LBL_Azimut", "text", "Azimut = "..tostring(self:arrondir(Azimut,0)+self.offset).."°")
    self:updateProperty("value", self:arrondir(Azimut,0)+self.offset)
    self:updateProperty("unit", " °")
    self:updateView("LBL_Update", "text", os.date("%d/%m/%Y %H:%M:%S",os.time()))
    self:trace("=====================================")

    --bouclage toutes les minutes
    fibaro.setTimeout(60*1000, function() self:Main() end)
end


Pour accéder à la valeur azimut, il suffit de le faire dans une scène ou un QA avec une simple commande :

MonAzimut = fibaro.getValue(ID_du_QA, "value")

 

Voici le fichier téléchargeable Indicateur_Solaire.fqa

 

et son icone soleil.png.117787f4f5fdfbb4bfd589c109c003a0.png

 

 

EDIT : j'ai supprimé l'accès "openweathermap" qui n'était plus utile...

 

 

Modifié par jjacques68
  • Like 4
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est super, je viens de le mettre dans mon HC3 et ça marche très bien.
Je peux penser à de nombreuses utilisations: stores, luminaires...
Avec quoi l'utilisez-vous?

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

pour la part que pour les volets...

s'il fait trop chaud intérieur/extérieur et qu'il y a du soleil, je ferme.

je réouvre selon l'azimut...

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai quelques remarques à faire sur ce qa
Il serait bien de
Mettre offset et altitude dans les variables QA
Il y a trop de self:trace je pense que l'on doit mettre juste le strict minimum afin de ne pas surchargé inutilement le debut
C'est super lorsque l'on a quelques QA
Super travail merci pour le partage

Envoyé de mon BLA-L29 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir a tous 

 

Je te remercie encore jjacques68 pour ton aide.

Je l'utilise pour mes volets quand il fais chaud les volet ce ferme coter soleil et s ouvre cote ombre tout au long de la journée.

Je pense utiliser la hauteur du soleil pour faire differencier entre l été et l hiver pour effectuer le scenario inverse en hiver.

profiter un max du soleil et éviter un max la déperdition de température coté ombre.

 

pour essayer d apprendre jai bidouiller ton QA et fait juste un autre pour la hauteur du soleil.

 

Hauteur_Soleil.fqa

 

Je débute je tatonne par deduction je sais que c est loin d être parfait mais ca marche lol 

 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×