-
Compteur de contenus
101 -
Inscription
-
Dernière visite
-
Jours gagnés
2
Tout ce qui a été posté par pedia
-
Et bien . Du coup, il faut peut-être mettre à jour le fichier syntaxe, car si on veut se servir du weathercondition la syntaxe est {"Weather", "WeatherCondition", "X"}, non ?
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
J'ai testé plutôt ça : GEA.add({"Weather!", ""}, 0, "{Result}") GEA.add({"Weather"}, 0, "{Result}") GEA.add({"WeatherLocal"}, 0, "{Result}") GEA.add( {{"WeatherLocal!", "Temperature", ""}, {"WeatherLocal!", ""}}, 30, " La température ext. est de #value[1]# ° - météo : #value[2]#") Pour le coup ça marche, j'ai eu : - cloudy - La température ext. est de 12° - météo : nuageux Par contre, ma ligne : GEA.add({"Weather", "cloudy"}, 30, "Pas beau") n'envoie rien. Ça devrait mettre "Pas beau" du coup non ?
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Bonjour à tous, Je cherche à utiliser la fonction weather. Après plusieurs essais infructueux, je suis revenu au basique en reprenant le mode d'emploi et le fichier syntaxe. J'essaie : GEA.add({"Weather", "cloudy"}, 0, "Pas beau") Evidemment je l'ai testé quand c'était nuageux, vérifié dans /api/devices/id. Normalement j'attends au démarrage de GEA le message "Pas beau" mais rien. J'ai le message par défaut du démarrage de GEA (donc les pushs marchent bien). J'ai rajouté dans l'entête : %% weather WeatherCondition J'ai essayé avec weatherlocal, pareil. J'ai cherché sur le fil de discussion mais je n'ai pas trouvé... Est-ce que quelqu'un peut m'orienter sur mon ou mes erreurs ? Merci d'avance.
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Je relance le sujet. J'ai comme beaucoup d'autres apparement un message d'erreur et il ne semble plus se connecter à WU. Quelqu'un a réussi à se connecter ? Ou vous avez laissé tomber ? Vous utilisez le panneau d'arrosage du coup ?
-
Mes lignes avec cette variable sont : GEA.add({{"Or", 57, 212, 22, 158} , {"Global", "Presence_Cour", "NON"}}, -1, "", {{"Time", "Sunset", "Sunrise"}, {"Global", "Presence_Cour", "OUI"}, {"Room", "Cour", "turnOn"}, {"Hue", {54, 76, 77, 112, 136}, "bri", 255}, {"Hue", {100, 186}, "bri", 175}, {"Scenario", 23}}, "Allumage de la cour") GEA.add({57, {"Global", "Presence_Cour", "OUI"}, {"Value", 212, 0}}, 2.5*60, "", {{"Inverse"}, {"turnOff", {54, 76, 77, 100, 109, 112, 136, 186}}, {"Global", "Presence_Cour", "NON"}}, "Extinction de la cour") GEA.add(true, 30, "", {{"Time", "Sunrise+3"}, {"turnOff", {54, 76, 77, 100, 109, 112, 136, 186}}}, "Extinction de la cour") Les devices 57, 212, 22 sont 3 détecteurs de portes, et 158 un Motion Sensor. Si ça peut aider à la compréhension.
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Bonjour, J'ai depuis peu quelques bugs dans mon GEA en 6.10 que je n'avais pas en 6.02. Avant de vous donner les détails des bugs, j'ai surtout une nouveauté dans le debug que je ne connaissais pas et que je ne comprends pas : [DEBUG] 17:50:05: Démarrage par évenement de GEA 6.10 (mode global [Presence_Cour]) [DEBUG] 17:50:05: -------------------------------------------------------------------------------- [DEBUG] 17:50:05: Connection reset by peer Est-ce que le connection rest by peer (écrit en rouge pour faire peur) est grave ? Est-ce que cela peut être lié ? Parce que ce n'est pas rare : Merci d'avance pour vos lumières.
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Quand je le réinclue, ça passe tout seul. Je rappuie 3 fois sur le bouton et hop. Et j'avais craint une manipulation malencontreuse d'un de mes rejetons sur l'interface Fibaro (avec le plug puis le détecteur d'ouverture), mais avec le FGMS, ce sont bien le detecteur + le capteur de luminosité + la température qui ont "disparu" d'un coup. La seule manipulation qui a eu lieu a été une mise à jour d'une tête terhomostatique Fibaro, puis une modification de ligne de GEA, et c'est là que je me suis aperçu du problème. En relançant GEA, j'ai eu dans le debug en rouge "ID_FGMS n'existe pas, GEA s'arrête". De retour sur l'interface des modules, effectivement plus rien disparition des "3 modules". Reboot de box, rien. Réinclusion du module sans souci qui réapparait avec un autre ID, bien sur. Bizarre non ? Et oui, j'étais connecté avec un compte admin, (le seul de toute façon)
-
Bonjour, Je reposte, car il m'est encore arrivé la même chose. Là, c'est un motion sensor qui s'est auto-exclu, disparu de ma liste des modules. Il est en hauteur, donc personne n'a pu le manipuler pour l'exclure de la box. Toujours pas d'idée ?
-
J'ai reçu ça ce matin par mail. Apparement ça se précise !... https://www.netatmo.com/fr-FR/partners/velux?utm_campaign=693364_20180705_fr_EU_Velux_HHC&utm_medium=email&utm_source=Dotmailer&dm_i=3J3D,EV04,2KQ2BZ,1KMNZ,1 S'il y en a qui essaie et qui arrive à savoir si c'est pilotable par l'HC2, via un plugin (je n'y crois pas trop) ou via api comme ça marche pas mal avec les modules virtuels, je serai très preneur de l'info.
-
Bonjour, pour la 2ème fois, j’ai un module qui a disparu de ma configuration. Ma box l’a oublié, comme si elle l’avait exclu. La première fois c’etait Une wallplug, je pensais qu’un de mes enfants avait joué avec le bouton et avait reussi a l’exclure. Mais la, c’est un détecteur d’ouverture de ma chambre. Tout le reste marche. Après reboot, rien de mieux et quand je vais dans api/devices, effectivement disparu. Quelqu’un a une idée ? En dehors, d’un fantôme ou une crise de somnambulisme où j’exclue tout seul des modules dans mon sommeil.
-
Oui. J'ai donc essayé de comprendre et j'ai modifié : for _, device in pairs(api.get("/devices?type=com.fibaro.philipsHueLight&roomID="..room.id)) do fibaro:call(device.id, action) end Et là effectivement ça marche ! Génial, ça va faciliter grandement certaines lignes !
- 12 330 réponses
-
- 1
-
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
L'idée est super mais chez moi ça allume/éteint toute la maison. Quand je mets un nom de pièce bidon, rien ne se passe, mais quand il y a une vrai pièce, ça agit sur toute la maison. Idem pour les sections, ça agit sur l'ensemble de la maison.
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Merci pour la réponse. Le problème avec ta solution pour la fusion des lignes est qu’il va vérifier et jeudi et vendredi aux différentes heures si je ne me trompe. Or j’ ai vraiment besoin que chaque plage horaire corresponde au jour précis.
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Bonjour, (je reposte au bon endroit) Je suis toujours embêté avec les ! - Inverse. J'ai utilisé en copié-collé la syntaxe du GEA_syntaxe qui me semblait bizarre car il manque un ")" : GEA.add( 73!), 30, "", {ACTIONS} ) Même là, j'ai un message d'erreur. Suis-je le seul ? Sinon autre question concernant Date & Time. J'ai plusieurs lignes comme celles-ci : GEA.add({57, {"Global", "Portail", "fermé"}}, -1, "", {{"Days", "Thursday"}, {"Time", "7:35", "7:50"}, {"turnOn", 64}}, "Ouverture programmé du portail") GEA.add({57, {"Global", "Portail", "fermé"}}, -1, "", {{"Days", "Friday"}, {"Time", "8:00", "8:20"}, {"turnOn", 64}}, "Ouverture programmé du portail") Je voulais les unifier. J'ai essayé : GEA.add({57, {"Global", "Portail", "fermé"}}, -1, "", {{{"Days", "Thursday"}, {"Time", "7:35", "7:50"}},{{"Days", "Friday"}, {"Time", "8:00", "8:20"}}, {"turnOn", 64}}, "Ouverture programmé du portail") , GEA.add({57, {"Global", "Portail", "fermé"}}, -1, "", {"Or", {{"Days", "Thursday"}, {"Time", "7:35", "7:50"}},{{"Days", "Friday"}, {"Time", "8:00", "8:20"}}, {"turnOn", 64}}, "Ouverture programmé du portail") et GEA.add({57, {"Global", "Portail", "fermé"}, {"Or", {{"Days", "Thursday"}, {"Time", "7:35", "7:50"}},{{"Days", "Friday"}, {"Time", "8:00", "8:20"}}}, -1, "", {"turnOn", 64}}, "Ouverture programmé du portail") Soit j'ai un message d'erreur, soit ça passe mais les conditions sont inopérantes et ça déclenche tout le temps. J'ai une erreur, ou la construction de GEA ne permet pas de mixer les dates comme ça et je garde mes différentes lignes ?
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Bon et bien il n'y a plus qu'a attendre le match-test Danfoss/Netatmo/Fibaro pour s'équiper. Une idée du gagnant ?
-
Oups, j'avais raté ce topic...
-
Bonjour, Il y en a qui se lance ? https://shop.netatmo.com/eur_fr/additional-valve-fr.html J'ai regardé le site de netatmo dans la partie développeur, je n'ai pas trouvé de référence pour commander les valves via l'API. Comme je ne pense pas faire marcher un jour le fameux plug-in. Je ne sais pas si on peut les commander avec la box via un VD, comme le thermostat.
-
Voici le VD. Les modifs comme dit plus haut : Dans le bouton Rafraichir, la partie précipitations dernière heure et aujourd'hui devient -- precipitations derniere heure et aujourd'hui -- local response ,status, err = WGROUND:GET("/api/"..cle_api.."/conditions/lang:FR/q/pws:"..pws..".json") local jsonTable = json.decode(response) fibaro:debug(jsonTable.current_observation.precip_1hr_metric) if tonumber(jsonTable.current_observation.precip_1hr_metric) ~= nil then rain1hour = jsonTable.current_observation.precip_1hr_metric end if tonumber(jsonTable.current_observation.observation_epoch) ~= nil then observationtime = jsonTable.current_observation.observation_epoch observationdate = os.date("%d/%m/%y à %Hh%M", jsonTable.current_observation.observation_epoch) end fibaro:debug(jsonTable.current_observation.observation_epoch) fibaro:debug('Dernière observation : ' ..observationdate) fibaro:debug(jsonTable.current_observation.precip_today_metric) if tonumber(jsonTable.current_observation.precip_today_metric) ~= nil then raintoday = jsonTable.current_observation.precip_today_metric end fibaro:debug(" Il est tombé " .. rain1hour .. " mm depuis 1 heure") fibaro:debug(" Il est tombé " .. raintoday .. " mm aujourd'hui") Pour pouvoir mettre à la fin : --Avertissement si station de référence inactive local interval = math.floor((tonumber(os.time())-tonumber(observationtime))/3600) if (interval < 12) then fibaro:debug('All Good') else fibaro:debug ('Not Good !') fibaro:call(id_phone, "sendPush", "Attention, station météo non joignable depuis" ..interval .."h. Dernier relevé le " ..observationdate..".") end C'est ainsi exprimé en heure en nombre entier. Il faut définir l'ID de son téléphone évidemment au début, si ce n'est déjà fait. Dans le bouton Calcul, j'ai mis la condition "il pleut" en premier dans mes conditions. Car avant tout, s'il pleut, il ne faut pas arroser, quelque soit le niveau de plus précédent. Il reste donc des redondances, mais j'avoue je n'ai pas osé me lancer dans la refonte intégrale. Ça marche en tout cas comme ça. Je n'aimais pas trop le format de la date dans traitement '%Y%M%D', qui était imposé je pense pour l'intégration dans la table et les calculs dessus. J'ai donc enlevé la mise à jour du label "LblTrait" du VD qui devient : -- Affichage -- fibaro:call(selfId, "pressButton", "9") fibaro:call(selfId, "setProperty", "ui.lblHier.value", rainyesterday .. " ") fibaro:call(selfId, "setProperty", "ui.lbl5.value", rain5days .. " ") fibaro:call(selfId, "setProperty", "ui.lbl10.value", rain10days .. " ") Le label est mis à jour par GEA au moment où il fait le traitement des données, je peux donc choisir le format voulu pour l'affichage dans le VD indépendamment de la table precipitations : GEA.add(true, 30, "", {{"Time", "00:06", "00:07"},{"VirtualDevice", 114, 14}, {"Function", function() fibaro:call(114, "setProperty", "ui.LblTrait.value", os.date("%x", now)) end}}) -- Traitement de l'Historique Pluie Calcul_Arrosage.vfib
-
Ca m'est déjà arrivé 2 fois. Il faut réinitialiser le device en faisant un appui long sur le bouton me semble t'il jusqu'à ce qu'il s'allume puis s'éteigne (de mémoire de 0h30). Mais apres ca remarche nickel. Les configurations douces ou dures via la box n'avaient jamais marché chez moi.
-
Ok j'ai trouvé simplement, quand on comprend que observation_epoch et os.time sont exprimées toutes 2 en secondes. Donc facile à soustraire. Du coup : local interval = math.floor((tonumber(os.time())-tonumber(observationtime))/3600) if (interval < 12) then fibaro:debug('All Good') else fibaro:debug ('Not Good !') fibaro:call(id_phone, "sendPush", "Attention, station météo non joignable depuis" ..interval .."h") end Comme ça on ne se fait pas avoir si la station ne transmet plus au site.
-
Entre la date actuelle et la date de mesure. Bah ce n'est pas si simple... pour moi... Et le net ne donne pas de réponse claire.
-
Bonjour à tous, Je me suis penché ce week-end sur ce sympathique VD. Je vous propose mes petits ajustements : J'ai tweaké les icônes des @couillerot pour les rendre un peu plus parlant pour moi, avec une icône : - on n'arrose pas parce qu'il pleut, - on n'arrose pas car pas besoin, - un arrosage court est nécessaire, - un arrosage long est nécessaire (notez l'herbe jaunissante qui a très soif... ;-) Comme dans le calcul d'arrosage, on sait s'il pleut ou pas, je récupère l'information dans une variable globale, qui me sert avec GEA pour me prévenir si j'ai laissé une fenêtre ouverte en plein déluge, et j'en profite pour adapter l'icône. if (pluiencours) then msg = "Il pleut" fibaro:setGlobal("Arrosage", "Non") fibaro:call(selfId,"setProperty","currentIcon", 1021) fibaro:setGlobal("Pluie", "oui") Il m'est arrivé que ma station de référence ne soit plus connectée et n'ai pas transmis depuis un certain temps (sur le site). J'ai donc fait un petit bout de code dans le bouton Rafraichir les données, pour vérifier que la date d'observation est bien la même que celle du jour en prenant la date de relevé : if tonumber(jsonTable.current_observation.observation_epoch) ~= nil then observationtime = jsonTable.current_observation.observation_epoch puis un peu plus bas --Avertissement si station de référence inactive local t1 = os.date("%d/%m/%y", observationtime) local t2 = os.date("%d/%m/%y", now) if (t1 == t2) then fibaro:debug('All Good') else fibaro:debug ('Not Good !') fibaro:call(id_phone, "sendPush", "Attention, station météo non joignable") end J'ai adapté GEA pour qu'il ne rafraîchisse pas autour de minuit pour ne pas me faire avoir. J'essaie de m'entrainer à faire un calcul d'intervalle de temps entre les 2, afin de dire par exemple de m'envoyer un avertissement en cas de différence supérieure à 12h par exemple, mais pour le moment je patine un peu. Voir mon autre post un peu plus bas. Je n'aimais pas trop le format de la date dans traitement '%Y%M%D', qui était imposé je pense pour l'intégration dans la table et les calculs dessus. J'ai donc enlevé la mise à jour du label "LblTrait" du VD qui devient : -- Affichage -- fibaro:call(selfId, "pressButton", "9") fibaro:call(selfId, "setProperty", "ui.lblHier.value", rainyesterday .. " ") fibaro:call(selfId, "setProperty", "ui.lbl5.value", rain5days .. " ") fibaro:call(selfId, "setProperty", "ui.lbl10.value", rain10days .. " ") Le label est mis à jour par GEA au moment où il fait le traitement des données, je peux donc choisir le format voulu pour l'affichage dans le VD indépendamment de la table precipitations : GEA.add(true, 30, "", {{"Time", "00:06", "00:07"},{"VirtualDevice", 114, 14}, {"Function", function() fibaro:call(114, "setProperty", "ui.LblTrait.value", os.date("%x", now)) end}}) -- Traitement de l'Historique Pluie Bravo encore pour le VD sinon.
-
En attendant les optimisations de scènes, j'ai fait quelques icônes pour le VD. J'ai créée un album dans la section icône (je n'ai pas réussi à l'ajouter dans l'album Netatmo déjà existant). Quelques exemples.
-
Voici donc mon tuto en V2, toujours sans prétention vu que je ne fais que reprendre les scripts de Titof_44. On va créer : - un VD qui pour le moment permet de visualiser les principales données du thermostat, et commander les grandes fonctions. - Mettre à jour automatiquement les programmes du thermostat (travail/vacances) en fonction de nos vacances si vous fonctionnez comme ça. Je ne me suis pas encore lancé dans le réglage manuel de la température, car la récupération de la température cible avec latence ne me permet d'avoir un réglage aussi précis que je veux avec des boutons + / - On va donc utiliser : - une scène qui sert à récupérer les données du thermostat - une scène qui sert commander le thermostat - une scène pour le switch de programme - un VD pour permettre de tout mettre en oeuvre - Des variables globales : Mode_Thermostat, Nom_Prog_Thermo, Temp_Cible_Netatmo, Temp_Salon, Vacances On commence par créer un VD afin d'avoir son ID de prêt. On créée par exemple 5 étiquettes, et 3 boutons. La scène de récupération des données (ID33 chez moi) : --[[ %% properties %% globals %% killOtherInstances --]] local client_id = 'XXXXX' local client_secret = 'XXXXXX' local username = 'XXXXX' local password = 'XXXXXXX' local relay_idDefault="XXXXXX" --Relay local device_idDefault="XXXXXX" --Thermostat --Toutes ces infos se trouvent dans https://dev.netatmo.com/en-US/resources/technical/reference/thermostat/getthermostatsdata 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=read_thermostat' getResponseData('https://api.netatmo.net/oauth2/token', request_body, function(data) if (data.access_token ~= nil) then token = data.access_token getDatas() 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 getDatas() DebugChange( "green", "Get Datas") request_body = 'access_token=' ..token.. '&device_id='..relay_id getResponseData('https://api.netatmo.net/api/getthermostatsdata', request_body, function(getData) Debug( "white", 'Status checking') if (getData.body ~= nil) then tDevices=getData.body.devices for w, relays in pairs(tDevices) do Debug( "white", 'Id Relay : '..relays._id) if relays._id==relay_id then for a, devices in pairs(relays.modules) do Debug( "white", 'Id Thermostat : '..devices._id) fibaro:call(113, "setProperty", "ui.Label3.value", devices.measured.setpoint_temp .." °C") if devices._id==device_id then --pour les autres datas voir -- https://dev.netatmo.com/en-US/resources/technical/reference/thermostat/getthermostatsdata curtemp=devices.measured.temperature Debug( "white", 'Temperature courante : '..curtemp) fibaro:setGlobal("Temp_Salon", curtemp) --je mets la température mesurée en variable globale fibaro:setGlobal("Temp_Cible_Netatmo", devices.measured.setpoint_temp) --je mets la température cible en variable globale batterylvl=devices.battery_percent Debug( "white", 'Niveau des piles : '..batterylvl) Debug( "white", 'Temprature cible : '..devices.measured.setpoint_temp) Debug( "white", 'Mode : '..devices.setpoint.setpoint_mode) fibaro:setGlobal("Mode_Thermostat", devices.setpoint.setpoint_mode) fibaro:call(113, "setProperty", "ui.Label2.value", batterylvl .." % ") --je mets à jour les étiquettes du VD --si on n est pas en mode Programmé, j'efface l'étiquette du nom du programme if devices.setpoint.setpoint_mode == "program" then fibaro:call(113, "setProperty", "ui.Label4.value", "Programmé") end if devices.setpoint.setpoint_mode == "away" then fibaro:call(113, "setProperty", "ui.Label4.value", "Absent") fibaro:call(113, "setProperty", "ui.Label7.value", " ") end if devices.setpoint.setpoint_mode == "manual" then fibaro:call(113, "setProperty", "ui.Label4.value", "Manuel") fibaro:call(113, "setProperty", "ui.Label7.value", " ") end --On récupère le nom du programme sélectionné, et on le met en plus dans une variable globale for k, schedule in pairs(devices.therm_program_list) do if schedule.program_id=="57f8c4aac8bd001b678b50f0" then if schedule.selected==true and devices.setpoint.setpoint_mode == "program" then fibaro:call(113, "setProperty", "ui.Label7.value", schedule.name) fibaro:setGlobal("Nom_Prog_Thermo", schedule.name) Debug( "white", 'Nom du programme : '..schedule.name) end end if schedule.program_id=="57f91fbde6da231c9c8b4f56" then if schedule.selected==true and devices.setpoint.setpoint_mode == "program" then fibaro:setGlobal("Nom_Prog_Thermo", schedule.name) fibaro:call(113, "setProperty", "ui.Label7.value", schedule.name) Debug( "white", 'Nom du programme : '..schedule.name) end end if schedule.program_id=="57f920aa1d7759f8988b4b10" then if schedule.selected==true and devices.setpoint.setpoint_mode == "program" then fibaro:setGlobal("Nom_Prog_Thermo", schedule.name) fibaro:call(113, "setProperty", "ui.Label7.value", schedule.name) Debug( "white", 'Nom du programme : '..schedule.name) end end end end end end end end end ) end --recupération des arguments local params = fibaro:args() if (params) then for k, v in ipairs(params) do if (v.relay_id) then relay_id = v.relay_id end if (v.device_id) then device_id = v.device_id end if (v.devices.measured.setpoint_temp) then devices.measured.setpoint_temp = v.devices.measured.setpoint_temp end if (v.therm_program_list) then therm_program_list = v.therm_program_list end if (v.devices.measured.temperature) then devices.measured.temperature = v.devices.measured.temperature end end end if relay_id==nil then relay_id=relay_idDefault end --Required mac address of the relay if device_id==nil then device_id=device_idDefault end --Required mac address of the thermostat oAuth() Il n'est pas encore nickel, il y a des redondances et autres probables améliorations. Pour le nom des variables (j'enfonce peut-être des portes ouvertes) il faut se fier à l'arborescence que l'on trouve sur https://dev.netatmo.com/en-US/resources/technical/reference/thermostat/getthermostatsdata dans la section Try It, avec des subtilités : devices : c'est relay modules : c'est devices Par exemple la température mesurée qui est sous l'arborescence modules/measured/temperature, la variable sera devices.measured.temperature Le pourcentage des piles qui est juste sous modules/battery_percent, la variable sera devices.battery_percent Dans la fonction getDatas on récupère les données qui nous intéressent et on les envoie à l'étiquette de notre VD correspondant. Exemple pour le pourcentage des piles : fibaro:call(ID[VD], "setProperty", "ui.Label2.value", batterylvl .." % ") J'ai mis la température mesurée également dans une variable globale pour essayer. Pour la scène qui commande le thermostat, ID30 chez moi, (encore une fois je ne fais que recopier le script de Titoff_44) --[[ %% 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() Attention subtilité les variables locales du début du script sont légèrement différentes de l'autre scène de récupération des données. Bien les remplir et ne pas faire un simple copier-coller. Ensuite pour le commander au niveau des boutons du VD on rentre les commandes comme spécifiées dans le post de Titoff_44. Par exemple : La scène 30 est ma scène de commande du Thermostat. La scène 33 est celle qui récupère les données. Voilà. J'ai remarqué une certaine latence chez moi pour la température cible qui se mettait à jour plusieurs secondes voire quelques minutes après le mise à jour du programme par exemple, mais même sur le site de Netatmo. Je ne sais pas s'il y a un moyen de forcer l'actualisation. Je fais un petit refresh automatique des données avec GEA : GEA.add( true , 60*60, "", {{"Scenario", 33}, {"Repeat"}}) Pour la scène de changement de programme, qui sera déclenchée via GEA (scène 37 chez moi) : --[[ %% properties %% globals %% killOtherInstances --]] local client_id = 'XXXXX' local client_secret = 'XXXXX' local username = 'xxxx' local password = 'xxxxx' --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="70:ee:50:1e:6b:70" --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="04:00:00:1e:8c:80" --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 fibaro:sleep(500) --j attends un peu pour ne pas le précipiter et attendre que la box mette à jour ces varibales globales SetAction() fibaro:sleep(1000) fibaro:startScene(33) --je rafraichis mon VD 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 --j'appelle l'id du nouveau programme désiré local newprog = fibaro:getGlobalValue("Nom_Prog_Thermo") if newprog == "Vacances scolaires" then newprog_id = "57f920aa1d7759f8988b4b10" end if newprog == "Semaine Type" then newprog_id = "57f8c4aac8bd001b678b50f0" end function SetAction() DebugChange( "green", "Action : changment de programme "..newprog) request_body_cam = 'access_token=' ..token.. '&device_id='..device_id ..'&module_id='..module_id getResponseData('https://api.netatmo.net/api/switchschedule', request_body_cam..'&schedule_id='..newprog_id, 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.schedul_id) then schedule_id = v.schedule_id end end 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. oAuth() Avec la technique de @pinou, j'ai une variable globale "Vacances" qui se met à jour automatiquement via mon calendrier en Travail / Vacances scolaires. Pour la synchro des mes vacances avec le bon mode programmé, j'utilise GEA : GEA.add({{"Global", "Vacances", "Travail"}, {"Global", "Mode_Thermostat", "program"}}, -1, "Changement programme Netatmo Travail", {{"Global", "Nom_Prog_Thermo", "Semaine Type"}, {"Scenario", 37}}) GEA.add({{"Global", "Vacances", "Scolaire"}, {"Global", "Mode_Thermostat", "program"}}, -1, "Changement programme Netatmo Vacances", {{"Global", "Nom_Prog_Thermo", "Vacances scolaires"}, {"Scenario", 37}}) Je précise bien dans les conditions que je dois être en mode "program", car supposons que je parte hors vacances scolaires et que je mette volontairement en mode absence (away), je ne voudrais pas qu'il me rebascule sur un mode programmé. Le scenario 37 est chez moi la scène de changement de programme. C'est assez fonctionnel, même si ça mérite de nombreuses améliorations comme de pouvoir choisir la température cible. Mais ça à le mérite de marcher chez moi, alors que le plugin de Netatmo avait été incapable jusque là de simplement trouver le thermostat sur mon réseau et ce malgré de nombreuses et infructueuses tentatives (cf. mes posts précédents désespérés). Prochaine étape, le réglage en manuel de la température via le VD. J'ai retrouvé le sourire, et oui, ceux qui hésitait à acheter ce thermostat, peuvent franchir le pas à présent.
-
A y est !!!!!!! N'hésitez pas à rectifier si je dis des bêtises, mais dans ce que j'ai compris, les fameux objets sont des tables à ouvrir, c'est pour ça que je ne pouvais y avoir accès directement. J'ai donc fait : for k, schedule in pairs(devices.therm_program_list) do if schedule.program_id=="57f8c4aac8bd001b678b50f0" then if schedule.selected==true then Debug( "white", 'Nom du programme : '..schedule.name) end end if schedule.program_id=="57f91fbde6da231c9c8b4f56" then if schedule.selected==true then Debug( "white", 'Nom du programme : '..schedule.name) end end if schedule.program_id=="57f920aa1d7759f8988b4b10" then if schedule.selected==true then Debug( "white", 'Nom du programme : '..schedule.name) end end La subtilité est que dans ces objets, on sait s'ils sont sélectionnés (variable selected) qui est une variable booléenne d'où la vérification si elle est true et pas simplement savoir si elle existe comme j'avais tenté de faire. Je remets donc l'intégralité de la fonction getData : function getDatas() DebugChange( "green", "Get Datas") request_body = 'access_token=' ..token.. '&device_id='..relay_id getResponseData('https://api.netatmo.net/api/getthermostatsdata', request_body, function(getData) Debug( "white", 'Status checking') if (getData.body ~= nil) then tDevices=getData.body.devices for w, relays in pairs(tDevices) do Debug( "white", 'Id Relay : '..relays._id) if relays._id==relay_id then for a, devices in pairs(relays.modules) do Debug( "white", 'Id Thermostat : '..devices._id) Debug( "white", 'Temprature cible : '..devices.measured.setpoint_temp) fibaro:call(113, "setProperty", "ui.Label3.value", devices.measured.setpoint_temp .." °C") if devices._id==device_id then --pour les autres datas voir -- https://dev.netatmo.com/en-US/resources/technical/reference/thermostat/getthermostatsdata curtemp=devices.measured.temperature Debug( "white", 'Temperature courante : '..curtemp) fibaro:setGlobal("Temp_Salon", curtemp) fibaro:setGlobal("Temp_Cible_Netatmo", devices.measured.setpoint_temp) batterylvl=devices.battery_percent Debug( "white", 'Niveau des piles : '..batterylvl) Debug( "white", 'Temprature cible : '..devices.measured.setpoint_temp) fibaro:getValue(batterylvl, "value") fibaro:getValue(devices.measured.setpoint_temp, "value") Debug( "white", 'Mode : '..devices.setpoint.setpoint_mode) fibaro:call(113, "setProperty", "ui.Label2.value", batterylvl .." % ") fibaro:call(113, "setProperty", "ui.Label9.value", "Max.") if devices.therm_program_list.program_id=="57f8c4aac8bd001b678b50f0" then Debug( "white", 'Nom du programme : '..devices.therm_program_list.selected) end if devices.setpoint.setpoint_mode == "program" then fibaro:call(113, "setProperty", "ui.Label4.value", "Programmé") end if devices.setpoint.setpoint_mode == "away" then fibaro:call(113, "setProperty", "ui.Label4.value", "Absent") end if devices.setpoint.setpoint_mode == "manual" then fibaro:call(113, "setProperty", "ui.Label4.value", "Manuel") end for k, schedule in pairs(devices.therm_program_list) do if schedule.program_id=="57f8c4aac8bd001b678b50f0" then if schedule.selected==true then Debug( "white", 'Nom du programme : '..schedule.name) end end if schedule.program_id=="57f91fbde6da231c9c8b4f56" then if schedule.selected==true then Debug( "white", 'Nom du programme : '..schedule.name) end end if schedule.program_id=="57f920aa1d7759f8988b4b10" then if schedule.selected==true then Debug( "white", 'Nom du programme : '..schedule.name) end end end end end end end end end ) end Ça avance, ça avance...