Aller au contenu

Plugin Netatmo


PITP2

Messages recommandés

  • 2 mois après...

Avec le thermostat, Comment faire pour effectuer les actions du plugin en code LUA (pour une gestion de fenêtres ouvertes).

J'ai bien vu turnOff, turnOn, setVolume, ... J'aurais aimé passé en mode absence ou hors gel, voir modifier la t° courante par LUA.

J'ai fait plein de test mais rien. :(. Quelqu'un a réussi sans passer par le VD de Steven ?

 

 

Lien vers le commentaire
Partager sur d’autres sites

salut @Titof_44

 

en effet le plugin ne sert à rien ...

@Moicphil avait développé un VD

mais ça marchait pas correctement, car ça plantait au bon d'un moment.

après plusieurs tests, il semblerait que le VD seul (sans avoir le plugin installé) ça fonctionne.

 

j'ai pas retenté car la flemme supprimer le plugin (j'ai tout la station météo dessus)

 

Lien vers le commentaire
Partager sur d’autres sites

J'en ai fait un aussi, voir ma signature, mais il faut héberger une page PHP quelque part et savoir ajuster le code pour ses besoins. Mais j'ai accès à toutes les fonctions.
Maintenant la gestion de mon thermostat est confiée à Jeedom, le plugin est très bien fait, et je peux commander et lire à partir de la hc2

Sent from my SM-N910F using Tapatalk


Lien vers le commentaire
Partager sur d’autres sites

@Sakkhho et @sebcbienmerci pour vos réponses. Comme j'aime bien mon thermostat et ma HC2 et que mon besoin est de jouer avec le thermostat sur des actions précises,

je vais garder le plugin et je poste ici une petite scène pour gérer le thermostat :) :

 

Utilisation : fibaro:startScene(idg["SCN_SETTHERMOSTAT"],{ {setpoint_mode="away"} }) --exemple pour le mode absent. (idg["SCN_SETTHERMOSTAT"]= id de la scène)

Vu que je n'ai qu'un thermostat je ne passe pas le device_id et module_id car ils sont mis par défaut dans la scène sinon il faudrait les passer en paramètres.

Code de la scène SCN_SETTHERMOSTAT :

--[[
%% properties
%% globals
%% killOtherInstances
--]]
local idg=json.decode((fibaro:getGlobal('idTable')))	--ids de mes modules
local client_id = 'XXXXXXXXXXXXXXXXXXXX'
local client_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
local username = 'xxxxxxxxxxxxxxx'
local password = 'xxxxxxxxxxxxxxxxxxxxx'
--local homeId = 'xxxxxxxxxxxxxxxxxxxxxxx'
-- homeId trouver sur site : https://my.netatmo.com/app/camera
-- a droite profil puis survol maison regarder sur barre chrome
local device_idDefault="xx:xx:xx:xx:xx:xx" --Relay
-- Relay trouvé sur site : https://my.netatmo.com/app/energy
-- Il suffit de remplacer le g par 70:ee:50.
--Par example g002460 a pour adresse MAC 70:ee:50:00:24:60
local module_idDefault="xx:xx:xx:xx:xx:xx"	--Thermostat
-- Thermostat trouvé sur site : https://dev.netatmo.com/resources/technical/reference/thermostat/getthermostatsdata
-- try it et dans le resultat aller à body devices _id modules _id
local debug = 1

local token = ''
local request_body = ''

Debug = function ( color, message )
  if (debug == 1) then
  	fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
  elseif (debug == 0) then
  end
end

DebugChange = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

DebugError = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

local sourceTrigger = fibaro:getSourceTrigger();

function oAuth(nextFunction)
	local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=write_thermostat'
	getResponseData('https://api.netatmo.net/oauth2/token', request_body, 
    	function(data) 
      		if (data.access_token ~= nil) then
        		token = data.access_token
       			SetAction()
     	 	else
       		 	DebugError( "red", "oAuth-API-Call n'a donné aucune valeur de retour");
      		end
    	end
    )
end

function getResponseData(url, body, func)
 local http = net.HTTPClient()
 http:request(url, { 
 options = { 
 method = 'POST', 
         headers = {
 ['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
 },
 data = body
 },
 success = function(response)
 func(json.decode(response.data))
 end
 })   
end

function SetAction()
	DebugChange( "green", "Action : "..setpoint_mode)
	request_body_cam = 'access_token=' ..token.. '&device_id='..device_id ..'&module_id='..module_id ..'&setpoint_mode='..setpoint_mode
   	--Not Required
  	if setpoint_endtime~=nil then
    	request_body_cam =request_body_cam ..'&setpoint_endtime='..setpoint_endtime
    end
  	if setpoint_temp~=nil then
    	request_body_cam =request_body_cam ..'&setpoint_temp='..setpoint_temp
    end
  	getResponseData('https://api.netatmo.net/api/setthermpoint', request_body_cam, 
    function(getData)
 	end
	)
end

--recupération des arguments
local params = fibaro:args()
if (params) then
  for k, v in ipairs(params) do
    if (v.device_id) then device_id = v.device_id end
    if (v.module_id) then module_id = v.module_id end
    if (v.setpoint_mode) then setpoint_mode = v.setpoint_mode end
    if (v.setpoint_endtime) then setpoint_endtime = v.setpoint_endtime end
    if (v.setpoint_temp) then setpoint_temp = v.setpoint_temp end
  end
end

if setpoint_mode==nil then
  	fibaro:debug("Abort")
	fibaro:abort()
end

if device_id==nil then device_id=device_idDefault end	--Required mac address of the relay
if module_id==nil then module_id=module_idDefault end	--Required mac address of the thermostat
--setpoint_mode	--Required
--program 	: Currently following a weekly schedule
--away		: Currently applying the "away" temperature as defined by the user
--hg		: Frost-guard
--manual	: Currently applying a manually set temperature setpoint
--off		: Currently off
--max		: eating continuously
--setpoint_endtime --Not Required
--If setpoint_mode is max or manual, defines the validity period of the setpoint. Default is null.
--setpoint_temp --Not Required
--If setpoint_mode is manual, returns the temperature setpoint in °C.

DebugChange( "green", "device_id : "..device_id)
DebugChange( "green", "module_id : "..module_id)
DebugChange( "green", "setpoint_mode : "..setpoint_mode)

oAuth()

 

 


 

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

cette scène est indépendante du plugin.

un autre exemple : pour repasser en mode programmation standard :

fibaro:startScene(idg["SCN_SETTHERMOSTAT"],{ {setpoint_mode="program"} }) et c'est tout ;)

Les possibilités sont détaillées dans la scène.

Il faut évidement mettre les bons paramètres au début de la scène

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

oui cela fait la même chose que ton script mais sans php et web server , sans vd et sans plugin et sans jeedom. la scène est autonome.

exemple d'utilisation : sur une plage de confort, le week end par exemple et si on part de l'habitation et qu'il n' y plus personne j'utilise cette scène pour passer en mode absence (17°). des qu'on arrive je repasse en confort.

Modifié par Titof_44
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Alors moi je dis BRAVO !

 

Ça ma réconcilie avec mon thermostat. J'ai réussi à le commander via mon HC2, sans passer par le plugin de *¨%£¨% qui m'avait fait m'arracher les cheveux. Et j'ai failli verser une petite larme quand la température de consigne s'est modifiée après avoir lancé la scène sur ma box. J'entrevoie à nouveau la lumière... Merci.

 

 

Lien vers le commentaire
Partager sur d’autres sites

pour cette scène je me suis inspiré de la scène présence de la welcome de boomx normalement il n'i a plus de variable de welcome sauf en commentaire.

Pour ma part la welcome marche du tonnerre avec la reconnaissance des personnes (idéal pour des message personnalisé : arrivée, anniversaire, ...) et le flux video.

Lien vers le commentaire
Partager sur d’autres sites

Ahhh génial !!!
Et ça fonctionnera aussi si on a plusieurs Netatmo ? (J'ai deux weather et deux thermostats)
Ça me fera plaisir d'arrêter le serveur web de.mon Synology qui ne tourne que pour ça...

Sent from my SM-N910F using Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

J'essaie de récupérer la température mesurée par le thermostat en ajoutant ce que je croyais "simplement" la même syntaxe pour température. Je voulais tout d'abord la faire apparaitre dans le debug.

 

J'ai donc fait :

--[[
%% properties
%% globals
%% killOtherInstances
--]]

local client_id = 'xx'
local client_secret = 'xx'
local username = 'xxx'
local password = 'xxxx'
--local homeId = 'xxxxxxxxxxxxxxxxxxxxxxx'
-- homeId trouver sur site : https://my.netatmo.com/app/camera
-- a droite profil puis survol maison regarder sur barre chrome
local device_idDefault="xxx" --Relay
-- Relay trouvé sur site : https://my.netatmo.com/app/energy
-- Il suffit de remplacer le g par 70:ee:50.
--Par example g002460 a pour adresse MAC 70:ee:50:00:24:60
local module_idDefault="xxxx"	--Thermostat
-- Thermostat trouvé sur site : https://dev.netatmo.com/resources/technical/reference/thermostat/getthermostatsdata
-- try it et dans le resultat aller à body devices _id modules _id
local debug = 1

local token = ''
local request_body = ''

Debug = function ( color, message )
  if (debug == 1) then
  	fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
  elseif (debug == 0) then
  end
end

DebugChange = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

DebugError = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

local sourceTrigger = fibaro:getSourceTrigger();

function oAuth(nextFunction)
	local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=write_thermostat'
	getResponseData('https://api.netatmo.net/oauth2/token', request_body, 
    	function(data) 
      		if (data.access_token ~= nil) then
        		token = data.access_token
       			SetAction()
     	 	else
       		 	DebugError( "red", "oAuth-API-Call n'a donné aucune valeur de retour");
      		end
    	end
    )
end

function getResponseData(url, body, func)
 local http = net.HTTPClient()
 http:request(url, { 
 options = { 
 method = 'POST', 
         headers = {
 ['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
 },
 data = body
 },
 success = function(response)
 func(json.decode(response.data))
 end
 })   
end

function SetAction()
	DebugChange( "green", "Action : "..setpoint_mode)
	request_body_cam = 'access_token=' ..token.. '&device_id='..device_id ..'&module_id='..module_id ..'&setpoint_mode='..setpoint_mode ..'&temperature'..temperature
   	--Not Required
  	if setpoint_endtime~=nil then
    	request_body_cam =request_body_cam ..'&setpoint_endtime='..setpoint_endtime
    end
  	if setpoint_temp~=nil then
    	request_body_cam =request_body_cam ..'&setpoint_temp='..setpoint_temp
    end
    if temperature~=nil then
        request_body_cam =request_body_cam ..'&temperature='..temperature
    end
  	getResponseData('https://api.netatmo.net/api/setthermpoint', request_body_cam, 
    function(getData)
 	end
	)
end

--recupération des arguments
local params = fibaro:args()
if (params) then
  for k, v in ipairs(params) do
    if (v.device_id) then device_id = v.device_id end
    if (v.module_id) then module_id = v.module_id end
    if (v.setpoint_mode) then setpoint_mode = v.setpoint_mode end
    if (v.setpoint_endtime) then setpoint_endtime = v.setpoint_endtime end
    if (v.setpoint_temp) then setpoint_temp = v.setpoint_temp end
    if (v.temperature) then temperature = v.temperature end
  end
end

if setpoint_mode==nil then
  	fibaro:debug("Abort")
	fibaro:abort()
end

if device_id==nil then device_id=device_idDefault end	--Required mac address of the relay
if module_id==nil then module_id=module_idDefault end	--Required mac address of the thermostat

--setpoint_mode	--Required
--program 	: Currently following a weekly schedule
--away		: Currently applying the "away" temperature as defined by the user
--hg		: Frost-guard
--manual	: Currently applying a manually set temperature setpoint
--off		: Currently off
--max		: eating continuously
--setpoint_endtime --Not Required
--If setpoint_mode is max or manual, defines the validity period of the setpoint. Default is null.
--setpoint_temp --Not Required
--If setpoint_mode is manual, returns the temperature setpoint in °C.

DebugChange( "green", "device_id : "..device_id)
DebugChange( "green", "module_id : "..module_id)
DebugChange( "green", "setpoint_mode : "..setpoint_mode)
fibaro:debug('la température est ' ..temperature)

oAuth()

J'ai également fait avec la dernière ligne en mettant : 

DebugChange( "green", "temperature : "..temperature)

 

 

Et j'obtiens toujours le message d'erreur : 

[DEBUG] 10:21:07: line 128: attempt to concatenate global 'temperature' (a nil value)

 
Le nom de la variable me semble la bonne si on se réfère au site Netatmo.
 
Mes compétences en code LUA étant plus limitée que je ne croyais, je sèche. Si quelqu'un peut m'aider ?
 
Après, je cherche surtout à récupérer la donnée pour l'intégrer dans d'autres scènes et GEA notamment, si on peut la récupérer "simplement".

Capture d’écran 2017-04-30 à 10.39.00.png

Lien vers le commentaire
Partager sur d’autres sites

Pour récupérer les valeurs du thermostat, j'ai gardé le plugin pour lire ses valeurs : (attention au polling du thermostat)

exemple :

 bModeAway=fibaro:getValue(idg["THERMOSTATNETATMO"], "ui.Away_Switch.value") --idg["THERMOSTATNETATMO"]=id du vd thermostat du plugin
 si bModeAway="1"  alors on est en mode absence

je pense que pour le t° c'est

tempcur=fibaro:getValue(idg["THERMOSTATNETATMO"], "ui.Current__Temperature_Value_Label.caption")

pour connaitre toutes les propriétés du plugin thermostat : http://IP/docs/#!/devices/getDevice

 

sinon la scène est que pour écrire &scope=write_thermostat et pas lire &scope=read_thermostat

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...