Aller au contenu

Barelle

Membres confirmés
  • Compteur de contenus

    350
  • Inscription

  • Dernière visite

  • Jours gagnés

    19

1 abonné

Profile Information

  • Sexe :
    Homme
  • Ville :
    Lauragais
  • Box
    Autre
  • Version
    HC3

Visiteurs récents du profil

4 620 visualisations du profil

Barelle's Achievements

Apprentice

Apprentice (3/14)

  • Very Popular Rare
  • Reacting Well Rare
  • Dedicated Rare
  • First Post Rare
  • Collaborator Rare

Recent Badges

172

Réputation sur la communauté

  1. Uniquement les variables, on ne modifie pas le code source.
  2. Bravo ! Et évite de modifier un code source si tu ne le maîtrises pas... De rien.
  3. Bon j'ai trouvé, tu as modifié le code, aussi je te suggère de supprimer le QA existant, d'importer la version ci-dessous, et enfin de déclarer les variables comme ci-dessus . Comparaison-0.12.fqa
  4. Dans la console, quels sont les messages du QA ?
  5. Tu devrais avoir ceci : Et tu peux supprimer les variables "209" et "221" inutiles.
  6. Merci, et pourrais-tu mettre une copie de l'onglet "Variables" du QA.
  7. Une copie d'écran de l'onglet paramètres du QA.
  8. Cette erreur à l'initialisation signifie que la valeur de l'un des paramètres "deviceId1" ou "deviceId2" ne correspond pas à une sonde de température. Note : il est inutile de recopier le code du QA dans les réponses, par contre les valeurs des paramètres, la correspondance entre les id et les appareils, et l'affichage du QA pourraient être plus utiles.
  9. Le QA proposé se comporte comme un thermomètre qui affiche la différence entre les valeurs de deux devices. Installe le, et dans ton cas, change le paramètre deviceId1 à la valeur 330 et le paramètre deviceId2 à la valeur 340. Ce QA te retournera la différence des valeurs et tu pourras l'interroger dans tes scènes comme n'importe quel thermomètre.
  10. Pour répondre à l’impossibilité de comparer les valeurs de deux dispositifs, je propose un QA qui interrogera les valeurs et qui stockera la différence dans sa propre valeur. Ce QA, voir ci-dessous, attend trois variables : Une variable "refreshDelay" qui contiendra la période (en secondes) de rafraichissement de la valeur calculée ; Deux variables "deviceId1" et "deviceId2" précisant les id des dispositifs dont il faudra réaliser la comparaison des valeurs. Note : un QA générique ne possédant pas l’attribut "value", j’ai retenu pour ce QA un type "Capteur de température". Le code lua : local myVersion = "0.12"; -- Barelle le 14/04/2025 : création local delay = 60; -- secondes local devId1, devId2 = 0, 0; local dev1Lbl = "Device 1"; local dev2Lbl = "Device 2"; local selfId = plugin.mainDeviceId; __TAG = "Comparaison_"..plugin.mainDeviceId; function QuickApp:onInit() local initError = false; local initErrorCause = ""; local testVariable = function(varName, defaultValue) local var = self:getVariable(varName); if (var == "") or (var == nil) then var = defaultValue; self:setVariable(varName, var); if type(var) == "table" then self:warning("QuickApp:onInit>testVariable>>>🤨 Variable \"" .. varName .. "\" not defined, now sets to " .. json.encode(var)); else self:warning("QuickApp:onInit>testVariable>>>🤨 Variable \"" .. varName .. "\" not defined, now sets to " .. stuffToString(var)); end else if type(var) == "table" then self:debug('QuickApp:onInit>testVariable>>>😐 variable "'..varName..'"='..json.encode(var), "SeaGreen"); else self:debug('QuickApp:onInit>testVariable>>>😐 variable "'..varName..'"='..tostring(var)); end end return var; end -- testVariable self:trace("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* [" .. __TAG .. "] onInit (version " .. myVersion .. ") *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); -- 0) Check if QuickApp device is enabled if api.get("/devices/" .. tostring(selfId)).enabled then self:updateProperty("log", ""); else self:updateProperty("log", "❌ Disabled ❌"); self:warning("QuickApp:onInit>>>Device " .. self.name .. " is disabled => QuickApp stopped."); return; end -- 1) On récupère le delai de raffraichissement des données delay = testVariable("refreshDelay", delay); self:trace('onInit>>>🙂 Variable "refreshDelay"=' .. delay .. ' seconds.'); -- 2) On récupère l'Id du premier appareil devId1 = tonumber(testVariable("deviceId1", devId1)); self:trace('onInit>>>🙂 Variable "deviceId1"=' .. devId1 .. '.'); -- 3) On récupère l'Id du second appareil devId2 = tonumber(testVariable("deviceId2", devId2)); self:trace('onInit>>>🙂 Variable "deviceId2"=' .. devId2 .. '.'); -- 4) On vérifie que les paramètres sont bons if (devId1 > 1) and (devId2 > 1) then local val1 = hub.getValue(devId1, 'value'); if (type(val1) ~= "number") then initError = true; initErrorCause = '🥵 Invalid device "deviceId1" : ' .. devId1; dev1Lbl = "Device 1 (id: " .. devId1 .. ")"; else dev1Lbl = "Device 1 (id: " .. devId1 .. ") value=" .. val1; end local val2 = hub.getValue(devId2, 'value'); if (type(val2) ~= "number") then initError = true; initErrorCause = initErrorCause ..' 🥵 Invalid device "deviceId2" : ' .. devId2; dev2Lbl = "Device 2 (id: " .. devId2 .. ")"; else dev2Lbl = "Device 2 (id: " .. devId2 .. ") value=" .. val2; end if (type(val1) == "number") and (type(val2) ~= "number") then self:updateProperty("value", val1-val2); end else initError = true; dev1Lbl = "Device 1 (id: " .. devId1 .. ")"; dev2Lbl = "Device 2 (id: " .. devId2 .. ")"; initErrorCause = '🥵 Paramètres invalides.'; end -- 5) On met à jour l'interface utilisateur self:updateView("dev1Lbl", "text", dev1Lbl); self:updateView("dev2Lbl", "text", dev2Lbl); self:updateView("majLbl", "text", "Le " ..os.date ("%d/%m/%Y à %H:%M:%S", os.time()) .. "."); if initError then self:warning(initErrorCause); self:updateView("resultLbl", "text", initErrorCause); self:updateProperty("value", 0); self:updateProperty("log", "❌ Erreur ❌"); else self:loop(delay); end end -- QuickApp:onInit function QuickApp:loop(delay) -- Check if QuickApp device is enabled if api.get("/devices/"..tostring(self.id)).enabled then self:updateProperty("log", ""); else self:updateProperty("log", "❌ Disabled ❌"); self:warning("Device", self.name, "is disabled => QuickApp stopped"); return end local valDev1 = hub.getValue(devId1, 'value'); local valDev2 = hub.getValue(devId2, 'value'); local ecart = valDev1 - valDev2; self:updateView("dev1Lbl", "text", "Device 1 (id: " .. devId1 .. "), value = " .. valDev1); self:updateView("dev2Lbl", "text", "Device 2 (id: " .. devId2 .. "), value = " .. valDev2); self:updateProperty("value", ecart); self:updateProperty("log", "Ecart = " .. ecart); self:updateView("resultLbl", "text", "L'écart entre les valeurs est de " .. ecart .. "."); self:updateView("majLbl", "text", "Le " ..os.date ("%d/%m/%Y à %H:%M:%S", os.time()) .. "."); self:trace("QuickApp:loop>>>Le QA a été mis a jour : prochaine mise à jour dans " .. delay .. " secondes."); hub.setTimeout(delay * 1000, function() self:loop(delay); end) end -- QuickApp:loop function stuffToString(stuff) local typ = type(stuff); if typ == "nil" then return "nil"; elseif typ == "string" then return stuff; elseif typ == "number" then return tostring(stuff); elseif typ == "boolean" then return iif(stuff, "true", "false"); elseif typ == "table" then return json.encode(stuff); elseif typ == "function" then return "function"; elseif typ == "userdata" then return "userdata"; elseif typ == "thread" then return "\"thread\" not supported by Fibaro!"; else return "unknown Lua variable type: "..typ; end end -- stuffToString Le fichier du QA : Comparaison-0.12.fqa
  11. En auto-hébergement, la solution NTFY me paraît présenter de nombreux atouts. Pour l'utiliser depuis au moins deux ans cela fonctionne bien dans une VM Debian sur mon NAS Synology.
  12. line 49: attempt to index field 'fields' (a nil value) Cela devrait provenir de la ligne : if jsonTable[j].fields.annee_scolaire ~= nil then et signifie que la table jsonTable ne contient pas de clé fields. Il serait toujours possible d'éliminer ce cas d'erreur, en écrivant : if (jsonTable[j].fields ~= nil) and (jsonTable[j].fields.annee_scolaire ~= nil) then cela supprimera l'erreur, mais ne corrigera pas le problème qui vient probablement de la conversion du fichier XML en table LUA. N'ayant plus de HC2 en état de fonctionnement, je ne pourrais pas aller plus loin dans la recherche de la cause.
  13. Comme déja dit, il s'agit d'un json contenant un tableau à plusieurs dimensions, l'utilisation d'un site pour le reformater (ici https://jsonlint.com/) permet de le mettre en évidence : [ { "nombreJours": 22, "libelle": "TEMPO ROUGE 2024 2025", "premierJourExclu": null, "nombreJoursTires": 6, "etat": "OUVERTE", "dernierJour": "2025-03-31", "dernierJourExclu": null, "typeJourEff": "TEMPO_ROUGE", "premierJour": "2024-11-01" }, { "nombreJours": 43, "libelle": "TEMPO BLANC 2024 2025", "premierJourExclu": null, "nombreJoursTires": 12, "etat": "OUVERTE", "dernierJour": "2025-08-31", "dernierJourExclu": null, "typeJourEff": "TEMPO_BLANC", "premierJour": "2024-09-01" }, { "nombreJours": 300, "libelle": "TEMPO BLEU 2024 2025", "premierJourExclu": null, "nombreJoursTires": 96, "etat": "OUVERTE", "dernierJour": "2025-08-31", "dernierJourExclu": null, "typeJourEff": "TEMPO_BLEU", "premierJour": "2024-09-01" } ] On constate que chaque ligne du tableau (qui correspond à la seconde dimension) ne possède pas d'index et qu'elle est identifiée par le contenu de la variable "typeJourEff". L'on va donc parcourir le tableau et pour chaque "typeJourEff" retenir la valeur recherchée à savoir le contenu de la variable "nombreJoursTires". Et l'on obtient ; -- Pour le test on récupère le json () local jsonStr = '[{"nombreJours":22,"libelle":"TEMPO ROUGE 2024 2025","premierJourExclu":null,"nombreJoursTires":6,"etat":"OUVERTE","dernierJour":"2025-03-31","dernierJourExclu":null,"typeJourEff":"TEMPO_ROUGE","premierJour":"2024-11-01"},{"nombreJours":43,"libelle":"TEMPO BLANC 2024 2025","premierJourExclu":null,"nombreJoursTires":12,"etat":"OUVERTE","dernierJour":"2025-08-31","dernierJourExclu":null,"typeJourEff":"TEMPO_BLANC","premierJour":"2024-09-01"},{"nombreJours":300,"libelle":"TEMPO BLEU 2024 2025","premierJourExclu":null,"nombreJoursTires":96,"etat":"OUVERTE","dernierJour":"2025-08-31","dernierJourExclu":null,"typeJourEff":"TEMPO_BLEU","premierJour":"2024-09-01"}]'; local jsonTable = json.decode(jsonStr); -- On transforme la chaîne de caractères en tableau local bleustires, blancstires, rougestires = 0, 0, 0; -- Déclaration et initialisation des variables for _, jsonRow in ipairs(jsonTable) do -- On parcourt la première dimension du tableau, la seconde dimension sera le tableau jsonRow if (jsonRow.typeJourEff ~= nil) and (jsonRow.nombreJoursTires ~= nil) then -- On s'assure que les index que l'on va utiliser sont bien présents if jsonRow.typeJourEff == "TEMPO_BLEU" then bleustires = jsonRow.nombreJoursTires; elseif jsonRow.typeJourEff == "TEMPO_BLANC" then blancstires = jsonRow.nombreJoursTires; elseif jsonRow.typeJourEff == "TEMPO_ROUGE" then rougestires = jsonRow.nombreJoursTires; end else print '"typeJourEff" ou "nombreJoursTires" pas trouvé'; end end print (bleustires, blancstires, rougestires); La meilleure façon de progresser et de comprendre le code et la logique de programmes existants.
  14. Il s'agit d'un tableau à deux dimensions, il n'y a qu'une variable nombreJoursTires par typeJourEff.
×
×
  • Créer...