Page 1 sur 2

La bonne température a la bonne heure

Publié : 18 mars 2018, 21:41
par deennoo
Salut a tous, cela faisait longtemps que je n’étais pas venu vous solliciter, et c'est bien dommage c'est vrai.

Une installation qui fonctionne c'est bien, allumer éteindre les choses en fonctions des heures et des présences c'est cool, le Control vocal c'est hyper cool, Xiaomi Yeelight c'est supracool.

Mais de mon coté il est temps d'ajouter un peu d'intelligence.

J'ai des pièces équipées de matériel Yeelight qui permet de jouer sur la température du blanc : Blanc Chaud presque orange a un blanc froid type néon.

L'une de ces pièces est presque aveugle, j'ai bien une fenêtre mais elle donne sur un escalier, sous une terrasse, donc même de jour il faut allumer la lumiére.

C'est sur cette pièce que je souhaite faire ceci partant du principe que :

- Le soleil au zénith peu ce traduire par une température de blanc froid de type néon : 6000k
- Que de nuit il nous faut une lumière plus chaude tirant sur le jaune orange : 3500k
- Que dans Domoticz nous avons les infos de levé et de couché du soleil

Je souhaiterait avoir une variation automatique de la température du blanc en fonction de la position du soleil, ceci toutes les 5 minutes, afin que ce soit le plus progressif possible et presque invisible / perturbant.

Exemple :

lever de soleil a 7h : Lumière a 3500k qui grimpe a 6000k a 13h puis retourne a 3500k a 19h pour le couché du soleil et la nuit.

Nous avons donc 19h00-7h : 12h00 de jour : 720 minutes soit 144 tranches de 5 minutes au total :
- 72 de 7h a 13h
- 72 de 13h a 19h

Soit des variations de : (6000-3500)/144 : 17.361111k j'arrondi a 17k

En attendant que les dev de Domoticz intègre la gestion des températures de blancs, il faut passer par l'api Yeelight, ce n'est pas le plus difficile.

Pour faciliter la gestion des variations je pensais garder la température a "afficher sur l'ampoule" dans une variable utilisateur.

Si les heures de lever et de coucher était aussi carré que l'exemple ce serait "facile" mais vous le savez ce sont des variables qui ne sont pas forcement multiple de 5, oui on peut tricher pour faire commencer et finir les variations au multiple de 5 prés.

J'ai bien des connaissances en LUA Domoticz mais elles sont "basiques" ici il faut faire des maths que je ne sais pas forcement traduire.

Si vous avez des exemples ou idée je suis preneur.

Merci

Re: La bonne température a la bonne heure

Publié : 19 mars 2018, 16:22
par vil1driver
Salut,

un peut à l'arrache.. ça va demander affinage, arrondissage, mis en variables, etc..... mais en gros un truc comme ça ?

Code : Tout sélectionner

commandArray = {}
local color
time = os.date("*t")
if time.hour > 7 and time.hour < 19 then

	local insecond = 60*(time.hour*60 + time.min)
	color = 4750+1250*math.cos(2.8*math.pi/66000*insecond)

else

	color = 3500

end
print('color:'..color)	
return commandArray 

Re: La bonne température a la bonne heure

Publié : 19 mars 2018, 21:15
par deennoo
vil1driver a écrit :Salut,

un peut à l'arrache.. ça va demander affinage, arrondissage, mis en variables, etc..... mais en gros un truc comme ça ?

Code : Tout sélectionner

commandArray = {}
local color
time = os.date("*t")
if time.hour > 7 and time.hour < 19 then

	local insecond = 60*(time.hour*60 + time.min)
	color = 4750+1250*math.cos(2.8*math.pi/66000*insecond)

else

	color = 3500

end
print('color:'..color)	
return commandArray 
Comme a ton d'habitude tu me sors un truc super...Merci.

Je publierais le script ici avant d'etre sur mon blog

Re: La bonne température a la bonne heure

Publié : 20 mars 2018, 15:34
par vil1driver
affinage #1

pleine prise en compte du soleil

Code : Tout sélectionner

commandArray = {}
local mini = 3500
local maxi = 6000
local delta = maxi - mini
local wakeup = 60*timeofday['SunriseInMinutes']
local goodnight = 60*timeofday['SunsetInMinutes']
local periode = goodnight - wakeup
local offset = wakeup-periode/2
local color = mini
local time = os.date("*t")
local now = 60*(time.hour*60 + time.min)
if now >= wakeup and now < goodnight then
	color = math.floor((maxi-delta/2)+(delta/2)*math.cos((now-offset)*2*math.pi/periode)+0.5)
end
print('color:'..color)	
return commandArray 
Image
Image

Re: La bonne température a la bonne heure

Publié : 22 mars 2018, 16:11
par vil1driver
petits codes pour convertir au besoin

KelvinColor en RGB

Code : Tout sélectionner

-- chargement des modules (http://easydomoticz.com/forum/viewtopic.php?f=17&t=3940)
dofile('/home/vil1driver/domoticz/scripts/lua/modules.lua')

local debug = true  -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir

-- to rgb

    color = color/100
    local red, green, blue
	
    --Calculate Red:

    if color <= 66 then
        red = 255
    else
        red = constrain(round(329.698727446 * ((color - 60) ^ -0.1332047592)),0,255)
	end
    
    --Calculate Green:

    if color <= 66 then
		green = constrain(round(99.4708025861 * math.log(color) - 161.1195681661),0,255)
    else
		green = constrain(round(288.1221695283 * ((color - 60) ^ -0.0755148492)),0,255)
    end
    
    --Calculate Blue:

    if color >= 66 then
        blue = 255
    else
		if color <= 19 then
            blue = 0
        else
			blue = constrain(round(138.5177312231 * math.log(color - 10) - 305.0447927307),0,255)
		end
	end
log(red)
log(green)
log(blue)
    
RGB en hexadecimal

Code : Tout sélectionner

-- to hex

local rgb = {red,green,blue}
local hexadecimal = '#'

	for key, value in pairs(rgb) do
		local hex = ''

		while(value > 0)do
			local index = math.fmod(value, 16) + 1
			value = math.floor(value / 16)
			hex = string.sub('0123456789ABCDEF', index, index) .. hex			
		end

		if(string.len(hex) == 0)then
			hex = '00'

		elseif(string.len(hex) == 1)then
			hex = '0' .. hex
		end

		hexadecimal = hexadecimal .. hex
	end

log(hexadecimal)

Re: La bonne température a la bonne heure

Publié : 23 mars 2018, 17:19
par landaisbenj
Des oufs ...

Re: La bonne température a la bonne heure

Publié : 25 mars 2018, 12:10
par deennoo
Merci Vil1D

Re: La bonne température a la bonne heure

Publié : 25 mars 2018, 16:37
par deennoo
vil1driver a écrit :petits codes pour convertir au besoin

KelvinColor en RGB

Code : Tout sélectionner

-- chargement des modules (http://easydomoticz.com/forum/viewtopic.php?f=17&t=3940)
dofile('/home/vil1driver/domoticz/scripts/lua/modules.lua')

local debug = true  -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir

-- to rgb

    color = color/100
    local red, green, blue
	
    --Calculate Red:

    if color <= 66 then
        red = 255
    else
        red = constrain(round(329.698727446 * ((color - 60) ^ -0.1332047592)),0,255)
	end
    
    --Calculate Green:

    if color <= 66 then
		green = constrain(round(99.4708025861 * math.log(color) - 161.1195681661),0,255)
    else
		green = constrain(round(288.1221695283 * ((color - 60) ^ -0.0755148492)),0,255)
    end
    
    --Calculate Blue:

    if color >= 66 then
        Blue = 255
    else
		if color <= 19 then
            blue = 0
        else
			blue = constrain(round(138.5177312231 * math.log(color - 10) - 305.0447927307),0,255)
		end
	end
log(red)
log(green)
log(blue)
    

Merci pour ce bout de code car j'ai bien "device" qui demande ce type d'info : Mon bureau

https://drive.google.com/uc?id=1nzgQOr5 ... uS_3KfeYUt

Fait avec code : https://github.com/jasoncoon/esp8266-fastled-webserver : une esp8266 + 5m de ruban de led adressable et c'est la fete : effets façon fete foraine, couleur, j'essaye de faire un plugin python pour ceci justement


Par contre il ne suit pas du tout une variation de blanc mais une variation de couleur, c'est fait expres (en prennant en compte les variation possible de teinte d'un ruban a l'autre) ?

Re: La bonne température a la bonne heure

Publié : 25 mars 2018, 20:57
par vil1driver
Pas de quoi, ce sujet m'a inspiré..
Je vai très certainement faire la même chose que toi.

Re: La bonne température a la bonne heure

Publié : 26 mars 2018, 00:48
par landaisbenj
Il devrait exister la même chose pour l'intensité lumineuse :} Plus ça s'assombrit, plus ça s'allume.