-
Compteur de contenus
350 -
Inscription
-
Dernière visite
-
Jours gagnés
19
Tout ce qui a été posté par Barelle
-
Et en mettant : if tonumber(status) == 200 then à la place de : if status == 200 then
-
Peut-être avec le code ci-après : local thisdevice = fibaro:getSelfId() local taskId = "1" local conn = Net.FHttp(fibaro:getValue(thisdevice, 'IPAddress'), fibaro:getValue(thisdevice, 'TCPPort')) -- connection espeasy/port response, status, errorCode = conn:GET('/json?tasknr=' .. taskId) fibaro:debug(response) //fibaro:sleep(1) if status == 200 then jsonTable = json.decode(response); -- decodage de la table json espeasy for _, row in ipairs(jsonTable.TaskValues) do fibaro:debug(json.encode(row)) -- Pour aider à la compréhension... if row.Name == "Temperature" then temp = row.Value elseif row.Name == "Humidity" then hum = row.Value end end fibaro:debug("temp="..temp..", hum="..hum); fibaro:call(thisdevice, "setProperty", "ui.Label1.value", temp .."°") -- affichage du resultat dans le label 1 fibaro:call(thisdevice, "setProperty", "ui.Label2.value", hum .."%") -- affichage du resultat dans le label 2 else fibaro:debug("error") fibaro:call(thisdevice, "setProperty", "ui.Label1.value", "error") fibaro:call(thisdevice, "setProperty", "ui.Label2.value", "error") end
-
Il faudrait sans doute supprimer la ligne jsonTable = '{ "TaskValues": [ {"ValueNumber":1, "Name":"Temperature", "NrDecimals":2, "Value":22.00 }, {"ValueNumber":2, "Name":"Humidity", "NrDecimals":2, "Value":59.00 }], "TTL":2000, "DataAcquisition": [ {"Controller":1, "IDX":1, "Enabled":"true" }, {"Controller":2, "IDX":0, "Enabled":"false" }, {"Controller":3, "IDX":0, "Enabled":"false" }], "TaskInterval":2, "Type":"Environment - DHT11/12/22 SONOFF2301/7021", "TaskName":"temp-Humidite", "TaskEnabled":"true", "TaskNumber":1 }' qui n'était là que pour les tests...
-
Les câbles ont-ils été changés ?
-
fibaro:call(thisdevice, "setProperty", "ui.Label1.value", temp.." °") fibaro:call(thisdevice, "setProperty", "ui.Label2.value", hum.." %") Et voilà ! De rien.
-
Le même code un peu plus propre, les indices 1 et 2 codés en dur n'étant pas très élégants... On recherche donc les valeurs Temperature et Humidity dans la table. jsonTable = '{ "TaskValues": [ {"ValueNumber":1, "Name":"Temperature", "NrDecimals":2, "Value":27.00 }, {"ValueNumber":2, "Name":"Humidity", "NrDecimals":2, "Value":64.00 }], "TTL":2000, "DataAcquisition": [ {"Controller":1, "IDX":1, "Enabled":"true" }, {"Controller":2, "IDX":0, "Enabled":"false" }, {"Controller":3, "IDX":0, "Enabled":"false" }], "TaskInterval":2, "Type":"Environment - DHT11/12/22 SONOFF2301/7021", "TaskName":"temp-Humidite", "TaskEnabled":"true", "TaskNumber":1 }' jsonTable = json.decode(jsonTable) for _, row in ipairs(jsonTable.TaskValues) do fibaro:debug(json.encode(row)) -- Pour aider à la compréhension... if row.Name == "Temperature" then temp = row.Value elseif row.Name == "Humidity" then hum = row.Value end end fibaro:debug("temp="..temp..", hum="..hum);
-
Ce code fonctionne : jsonTable = '{ "TaskValues": [ {"ValueNumber":1, "Name":"Temperature", "NrDecimals":2, "Value":27.00 }, {"ValueNumber":2, "Name":"Humidity", "NrDecimals":2, "Value":64.00 }], "TTL":2000, "DataAcquisition": [ {"Controller":1, "IDX":1, "Enabled":"true" }, {"Controller":2, "IDX":0, "Enabled":"false" }, {"Controller":3, "IDX":0, "Enabled":"false" }], "TaskInterval":2, "Type":"Environment - DHT11/12/22 SONOFF2301/7021", "TaskName":"temp-Humidite", "TaskEnabled":"true", "TaskNumber":1 }' jsonTable = json.decode(jsonTable) local temp = jsonTable.TaskValues[1].Value; local hum = jsonTable.TaskValues[2].Value; fibaro:debug("temp="..temp..", hum="..hum);
-
Le premier exclus permet de vérifier l'existence de la variable exclus et est équivalent à exclus ~= nil. La variable existant, le second test permet de s'assurer que ce n'est pas une chaîne vide.
- 215 réponses
-
- Module virtuel
- alarme
-
(et 1 en plus)
Étiqueté avec :
-
Bon, je vais essayer de me rattraper en avançant une explication pour le bug mentionné par Did. La scène utilise deux variables globales pour récupérer dans la fonction Update les données de la fonction getResponseData. Ces données sont récupérées de manière asynchrone par getResponseData. Quand la fonction Update lit la valeur des variables globales, celles-ci n'ont peut être pas encore été mise à jour par getResponseData. D'où des annonces erronées... Comment corriger ? 1) en n'utilisant plus de variables globales, le VD n'en ayant plus besoin. 2) en séparant les mises à jour des labels et des notifications relatives aux actuelles tables jsonTable0 et jsonTable1 dans des fonctions distinctes. 3) en appelant ces fonctions depuis la fonction success de getResponseData. Remarque : ces fonctions de mise à jour des labels et des notifications peuvent-être passées en paramètre à la fonction getResponseData (paramètre func), sous réserve de bien lancer func dans le cas (response.status==200). I hope this helps.
-
@Dragoniacs, au temps pour moi, il est exact que la table jsonTable1 indique en première position les prévisions du jour. Ma remarque était donc erronée...
-
L'annonce du jour est correcte, les données météo sont, elles, décalées d'une journée.
-
Je n'utilise pas les notifications, mais à la lecture du code de la scène, il me semble que les lignes : -- Définition des textes audio today_speach = Jours(tonumber(os.date("%w"))) .." : " .. jsonTable1.data[1].weather.description .. ". " .." Température entre ".. round(jsonTable1.data[1].min_temp,0) .." et ".. round(jsonTable1.data[1].max_temp,0) .." degrès. " .." Vent de ".. math.floor(jsonTable1.data[1].wind_spd*3.600) .." kilomètres par heure, en provenance ".. jsonTable1.data[1].wind_cdir_full ..". " .." Précipitations de ".. round(jsonTable1.data[1].precip,0) .. " milimètres. " tomorrow_speach = Jours(tonumber(os.date("%w"))+1) .." : " .. jsonTable1.data[2].weather.description .. ". " .." Température entre ".. round(jsonTable1.data[2].min_temp,0) .." et ".. round(jsonTable1.data[2].max_temp,0) .." degrès. " .." Vent de ".. math.floor(jsonTable1.data[2].wind_spd*3.600) .." kilomètres par heure, en provenance ".. jsonTable1.data[2].wind_cdir_full ..". " .." Précipitations de ".. round(jsonTable1.data[2].precip,0) .. " milimètres. " devraient plutôt être : -- Définition des textes audio today_speach = Jours(tonumber(os.date("%w"))) .." : " .. jsonTable0.data[1].weather.description .. ". " .." Température entre ".. round(jsonTable0.data[1].min_temp,0) .." et ".. round(jsonTable0.data[1].max_temp,0) .." degrès. " .." Vent de ".. math.floor(jsonTable0.data[1].wind_spd*3.600) .." kilomètres par heure, en provenance ".. jsonTable0.data[1].wind_cdir_full ..". " .." Précipitations de ".. round(jsonTable0.data[1].precip,0) .. " milimètres. " tomorrow_speach = Jours(tonumber(os.date("%w"))+1) .." : " .. jsonTable1.data[1].weather.description .. ". " .." Température entre ".. round(jsonTable1.data[1].min_temp,0) .." et ".. round(jsonTable1.data[1].max_temp,0) .." degrès. " .." Vent de ".. math.floor(jsonTable1.data[1].wind_spd*3.600) .." kilomètres par heure, en provenance ".. jsonTable1.data[1].wind_cdir_full ..". " .." Précipitations de ".. round(jsonTable1.data[1].precip,0) .. " milimètres. " En effet, jsonTable0.data[1] contient les prévisions pour aujourd'hui, alors que les prévisions du lendemain sont dans jsonTable1.data[1]...
-
Du moment que la scène "boucle" par l'utilisation des setTimeout, il n'est plus utile de la lancer depuis le VD, d'autant plus quelle est en autostart. Donc la mainloop du VD peut effectivement être vide, tout étant maintenant réalisé dans la scène
-
Je ne pense pas que cela vienne de l'API, mais plutôt du fait que os.date("%w") retourne une valeur entre 0 et 6, 0 étant le dimanche. Aussi, dans la fonction jour... function jour(j) if j > 6 then j = 0 end local jourSemaine = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}; return jourSemaine[j+1]; end -- jour
-
Le dimanche, vaste sujet.. Selon le dictionnaire de l'Académie (9e édition) : Donc, ce n'est pas clair, heureusement, la norme ISO 8601 est là pour nous préciser que le dimanche clôt la semaine et a pour code le chiffre 7. Le problème se complexifie dans les langages informatiques selon que l'indice de départ est "zéro" (algol, C, pascal et leur dérivés) ou "un", comme notamment le Lua. Par conséquent, pour le dimanche on peut rencontrer comme code : 0, 1, 6 ou encore 7 ! En pratique, il est prudent de vérifier au cas par cas...
-
Bravo ! Le VD et la scène fonctionnent bien. Je crains toutefois que pour les prévisions, la vitesse du vent soit affiché en m/s et non en km/h...
-
Même si je ne l'ai pas testé, le code ci-après devrait faire la même chose : --[[ %% autostart --]] function tempFunc() local currentDate = os.date("*t"); if (currentDate.hour == 18 and currentDate.min == 30) then fibaro:debug("ok envoi à venir"); api.post('/mobile/push', { ["mobileDevices"]={154}, -- ID du telephone : 154= S7 EDGE JJ ["message"]='Veux-tu prévenir la maison ?', -- La question que l'on veut posser ["title"]='Départ Travail', -- titre de la question ["category"]='YES_NO', -- 'YES_NO' ou 'RUN_CANCEL' ["data"]={["sceneId"]=66} -- ID de la scéne que l'on veut lancer } ); end setTimeout(tempFunc, 60*1000); end local sourceTrigger = fibaro:getSourceTrigger(); if (sourceTrigger["type"] == "autostart") then tempFunc(); end Quelques explications : - currentDate.wday ne peut prendre que les valeurs 0, 1, 2, 3, 4, 5, 6, ce test est donc inutile ; - pourquoi convertir les heures et minutes en chaîne de caractères avant de faire la comparaison ? - on a : local sourceTrigger = fibaro:getSourceTrigger(); ... local startSource = fibaro:getSourceTrigger(); if (startSource["type"] == "other") then if (sourceTrigger["type"] == "autostart") then -- code jamais executé Donc, on enlève, la bonne vieille technique du rasoir d'Ockham...
-
topic unique GCE Electronics EcoDevice RT2 - Gestionnaire d'énergie
Barelle a répondu à un(e) sujet de Lazer dans GCE Electronics
Je suis surpris, dans la mesure où les trames EDF, décodées par l'Ecodevice, n'ont pas changé, il n'y a aucune raison pour une quelconque incompatibilité technique avec le compteur Linky. Aussi, avec le RT2 cela ne devrait également pas fonctionner. Le problème provient probablement du paramétrage du compteur qui ne laisse pas passer les trames. Après une rapide recherche il semblerait nécessaire de paramétrer le compteur avec les "Trames de télé-information du mode historique"... -
Si tout le monde met en oeuvre cette politique, personne n'aura le loisir et le plaisir de trouver les anomalies qui nous permettent d'autant échanger sur ce forum. En synthèse, le bug c'est ce qui rapproche aussi bien les geeks que les geekettes...
-
Ben, moi aussi, elle tourne depuis maintenant plus de 3 heures, je ne trouve rien à en dire. Selon le forum Fibaro : https://forum.fibaro.com/topic/42880-4540-temporarily-unavailable-i-managed-to-update/ Traduction :
-
Problème rencontré lors de l'écriture d'un VD comportant plusieurs étiquettes : Le changement de l'ID de l'étiquette n'est pas pris en compte s'in comporte le caractère underscore , par exemple si le nouvel ID est "lblEV_1_8", il est systématiquement remplacé par : - "label_0_0" pour une étiquette en première position, - "label_1_0" pour une étiquette en deuxième position, - "label_x_0"pour une étiquette en position x. Cette capacité à casser ce qui fonctionne est assez remarquable chez Fibaro...
-
Oui, "%d+" retourne le premier nombre, "%d" retourne le premier chiffre rencontré de la gauche vers la droite, le + indiquant qu'il faut prendre aussi les suivants. Non, "%s" indique toutes les espaces (et oui, féminin en typographie...), ainsi : s=string.gsub("Nuit claire étoilée", "%s", "%%20"); print(s); -- retourne Nuit%20claire%20étoilée Pour ne remplacer que la première espace il eut fallu faire : s=string.gsub("Nuit claire étoilée", "%s", "%%20", 1); print(s); -- retourne Nuit%20claire étoilée -- ou encore : s=string.gsub("Nuit claire étoilée", " ", "%%20", 1); print(s); -- retourne Nuit%20claire étoilée Remarque : le signe "%" a un sens réservé dans les patterns, aussi est-il nécessaire de le doubler dans '%%20".
-
Pour remplacer tous les espaces par "%20", il faudrait plutôt faire : weather = string.gsub(weather, "%s", "%%20");
-
Avec : local s="aujourd'hui : 11°c - Nuit claire"; -- on extrait les chiffres local temperature = tonumber(string.match(s, "%d+")); -- "- " est considéré comme séparateur, on cherche sa position pos= string.find(s, "- "); -- on extrait la chaîne commençant en pos+2 local weather=string.sub(s, pos+2); print(temperature); print(weather); on obtient : 11 Nuit claire De rien...
-
Pour aider en restant dans le thème : print(string.gsub("moi c'est pareil, les pattern me perdent, -.......et j'en passe .mon cerveau n'est pas fait pour les pattern...", "-.*", " http://wxlua.free.fr/Tutoriel_Lua/Tuto/Strings/strings6.php"));