Aller au contenu

Lazer

Administrateur
  • Compteur de contenus

    25 874
  • Inscription

  • Dernière visite

  • Jours gagnés

    1 256

Tout ce qui a été posté par Lazer

  1. Lazer

    Ivee

    il est chouette le design, au moins si ça ne marche pas tu sais où tu peux te ... Blague à part, j'aimais bien le concept de radio réveil de la première version.... ça manque sur ma table de chevet la possibilité de piloter simplement tout le domicile.
  2. Nan la v5 c'est pour le CES en janvier [emoji14]
  3. Ça me paraît pas mal
  4. D'après ce que j'ai constaté : - quand la RAM est pleine (>80% environ) => plantage du process principal de la HC2, donc Erreur 503, interface Web indisponible, on ne peut plus rien faire àpart rebooter physiquement la box - tout le reste du temps => plantage aléatoire de certains process (scènes ou modules virtuels) sans aucun message d'erreur apparent dans la fenêtre de debug car il s'agit d'un core-dump au niveau de l'OS Linux. On ne peut pas les prévenir, et on peut les redémarrer en faisant une sauvegarde du VD/Scène planté => mon watchdog est làpour ça.
  5. Les fuites mémoires datent de la v4, et ça ne fait qu'empirer àmesure qu'ils ajoutent des nouvelles fonctionnalités. A priori on n'avait pas ces soucis en v3.
  6. Nico je pense que c'est aussi ma RAM qui a du dépasser les 80 % quand j'ai eu mon erreur 503 il y a 15 jours. Par contre j'insiste, on peut faire autant de requêtes http qu'on veut. Dans un problème de fuite mémoire, c'est évident que plus on fait travailler le système, plus on accélère la venue des problèmes. Rien ne dit que ça soit spécifiquement les requêtes http qui fuient, ça peut venir de n'importe où. C'est àFibaro de régler leurs problèmes de fuite mémoire. On a acheté une box puissante, c'est pour pouvoir l'exploiter, et ne pas se brider.
  7. je t'avoue que je ne sais répondre àaucune de ta série de question..... je n'ai jamais eu ces problèmes, je n'ai pas eu àcreuser le fonctionnement interne de la chose.
  8. Si le datastore est corrompu, je ne sais pas comment le réparer.... Donc si c'est le cas, les VM sont perdues Par contre pour Xpenology ce n'est pas grave. Tu peux repartir sur un nouveau Xpenoboot, qui devrait retrouver toutes les données de ton disque.
  9. Certes, mais après c'est le vieux débat qui revient : tu as installé une beta, donc il y a des bugs potentiels (et avérés). Je suis toujours sur la dernière version stable du mois d'août. C'est loin d'être parfait puisque j'ai des plantages de scènes/VD inexpliqués et une fois erreur 503, mais au moins le reste fonctionne (panneau de chauffage, trigger, etc). Oui la bière ça sera pour janvier euh attends, pourquoi au singulier [emoji14]
  10. Moi aussi Je n'en n'ai pas encore fait le tour (et j'aimerais bien que Fibaro m'y aide un peu.....) Malgré ses problèmes, elle reste plus stable que des solutions concurrentes, et plus performante. C'est juste que pour 600€ et avec un marketing de ouf, on se permet d'être plus exigeant. Fibaro n'a pas les moyens de ses ambitions. Les utilisateurs de Jeedom pardonnent plus facilement ses lacunes actuelles, d'autant plus que c'est une solution qui évolue plus vite.
  11. Ouais bah justement la Netatmo c'est une grosse verrue sur mon installation. Depuis que l'api météo de Yahoo déconne, je n'ai plus que la Netatmo pour remonter la température extérieure.... Pour combien de temps encore ? Je l'ai surtout acheté parce qu'elle m'a coûté 60€, j'estime qu'elle ne vaut pas son prix de vente. M'enfin la mode est au jetable, aujourd'hui tout le monde trouve normal d'acheter quelque chose qui sera remplacé très rapidement..... Y'a quelque chose qui me choque moi..... Le cloud c'est une magnifique opportunité pour les fournisseurs de produits d'associer du service et donc de contrôler légalement l'obsolescence programmée. Même dans le monde pro, certaines entreprises qui étaient parmi les premières àdématérialiser leur SI dans le cloud, sont en train de faire marche arrière.... Comme quoi, le cloud n'est pas la réponse àtous les problèmes, et il y a un marché pour les deux. Quant àla domotique, les offres des grands constructeurs c'est pour le grand public, qui ne connaît rien (et ne veut rien) connaître àla technique. Ce n'est pas du tout la même cible que les box domotique que nous connaissons. Avec nos box (quelque soit la marque) nous ferons toujours 10 fois plus que ce que fait la domotique àla Nest & co. C'est pas toi qui dira le contraire puisque tu assembles encore tes PC àla main.
  12. Dans les propriétés du module, il y a une case àcocher pour l'activer/désactiver. Ce n'est pas possible de modifier les id.
  13. Mprinfo Google ou Microsoft ou encore un autre, pour avoir une solution Cloud ultra limitée (cf Works with Nest), non merci très peu pour moi. Faudrait vraiment que les gars de eedomus se réveillent et comprennent qu'ils ont raté trop de clients avec leur box dépendante du cloud, sans ça ils auraient pu faire un malheur.
  14. Ca devient ridicule cette histoire de http :angry: On a une box surpuissante, avec du LUA, justement pour pouvoir s'ouvrir au monde extérieur (les objets connectés notamment), et ne pas être limité aux périphériques Z-Wave nativement supportés. Au contraire, j'en ai de plus en plus des requêtes http, c'est justement ce qui fait l'intérêt de la HC2.
  15. Ah mon avis, il n'y a aucun intérêt àsurveiller les scènes en déclenchement instantané àbase de trigger. Déjàpar nature, le trigger est aléatoire et n'intervient pas àintervalle régulier. Ensuite, une scène déclenchée par trigger àune durée de vie très courte, elle effectue sa tâche puis meurt. Donc si il y a un bug, c'est une erreur de logique de programmation, et cela plantera àtous les coups, et doit donc être corrigé immédiatement par le développeur. Le watchdog n'est pas un debugguer.
  16. Pas certain que ce watchdog te permette de détecter des signes avant coureur..... ou alors si tu trouve une piste, faudra partager ! Tu peux utiliser le script de Jojo à faire tourner sur une machine externe type Synology afin de détecter le plantage de la HC2..... et qui envoie un email, car impossible de redémarrer la HC2 sans intervenir directement dessus.
  17. Merci. Je n'avais pas encore pris le temps, mais je viens maintenant de mettre mon icône au début du topic. Pour toutes les scènes, je préfère inclure l'image dans le clap de cinéma, afin de bien différencier dans l'interface web les scènes (sur lesquelles ont n'est pas censé agir) des VD (sur lesquels on peut agir).
  18. oui c'est faisable..... déjàce que tu peux faire, c'est activer le mode debug = true qui te permettra de visualiser un peu mieux ce qui se passe. Et dans ta scène/VD àsurveiller, tu crées volontairement l'erreur.
  19. Jojo, je vais détailler cette histoire d'ERROR dans le 2nd post (d'ailleurs j'ai commencé à y ajouter quelques infos). Tu peux laisser type="ERROR" pour les scènes, mais cela sera sans effet tant que Fibaro ne ré-implémentera pas cette fonctionnalité. Pour le moment, ERROR n'existe plus que pour les Main Loop de VD. Donc, si tu as une Scène dont tu connais précisément le message d'erreur qui apparait aléatoirement, tu peux le mettre dans le paramètre no_match.text. Je sais que c'est le cas de Gazous pour l'une de ses scènes dans le topic "Catcher une erreur LUA" d'où est parti cette idée de watchdog. Et on peut dire que ce changement de comportement tombe au bon moment (enfin, je m'en serais bien passé.... mais il faut faire avec.... Fibaro, développeurs, régression, bug, tout ça quoi....) car j'étais justement en train de développer ce watchdog quand j'ai passé ma box de développement de la v4.057 à v4.058, tandis que ma box de prod est toujours en v4.056. Donc j'ai bien vu la différence. Ceci dit, pour une scène, je considère que le plus fiable est d'utiliser le paramètre count=1, car vous avez certainement 1 instance lancée en autostart avec une boucle infinie qui devrait tourner non-stop (cas connu de GEA). Remarquez que dans mon exemple, on a une double protection pour GEA, car on essaye également de matcher le text "Durée des traitements" qui apparait normalement toutes les 10 minutes.
  20. Lazer

    Catcher Une Erreur Lua

    C'est par là: [Tuto HC2] Watchdog Pour Scènes Et Modules Virtuels
  21. De façon générale, pour surveiller efficacement les main loop de modules virtuels, il faut que chaque main loop affche un message prédéfini à intervalle régulier. En effet, pour une main loop on ne peut pas faire appel à la fonction countScene(), et il n'est donc pas possible de détecter le cas où le module virtuel fait un core-dump au niveau de l'OS Linux.... puisque lorsque cela se produit, aucun message d'erreur spécifique n'est affiché dans la zone de débug de la main loop. Dans le cas particulier du module virtuel Sonos Player de Krikroff, il faut activer l'option Tk.isTraceEnabled = true dans le code de la main loop (qui se trouve vers la fin) Pour les prochains modules virtuels qui seront développés, je suggère d'ajouter ce type de message récurrent si vous souhaitez pouvoir surveiller efficacement les main loop. Quelques captures d'écran : Autostart de la scène, puis 15 minutes plus tard, les Check s'enchainent toutes les minutes : Lancement manuel d'une seule vérification immédiate dans une nouvelle instance de la scène (pour cela, autoriser au minimum 2 instances pour cette scène, puis cliquer sur le bouton Démarrer) : Exemple d'une scène (GEA, ID n°14) dont l'instance qui s’exécute en boucle infinie a planté. Il y a 0 instances, donc redémarrage de GEA :
  22. Watchdog Version 1.3 Voici une scène permettant de surveiller le fonctionnement des Scènes et Main Loop de Modules Virtuels sur Home Center 2 en version 4.x. Pour ce faire, les messages de la fenêtre de Debug sont analysés. De plus, pour les scènes uniquement, le nombre d'instances est compté. En cas de problème détecté, la scène ou le virtual device considéré est automatiquement redémarré, et une notification peut être envoyée. Copier/coller le script LUA suivant dans une nouvelle scène : --[[ %% autostart %% properties %% globals --]] -------------------------------------------------- -- Scene : Watchdog -- Author : Lazer -- Version : 1.3 -- Date : June 2017 -------------------------------------------------- -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { } local userID = {} -- Email local smartphoneID = {} -- Push local sms = { ["VD_ID"] = 0, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false -- -- Message function -- function Message(color, message) if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..(message or '<nil>')..'</span>') else fibaro:debug(message or '<nil>') end end -- -- Notification function -- function Notification(message, param) local message = message or "<vide>" Message("yellow", "Notification : "..message) if param then for _, notif in ipairs(param) do if debug then Message("grey", notif) end -- Envoi Push if notif == "push" and smartphoneID then for _, id in ipairs(smartphoneID) do if debug then Message("grey", "Send Push smartphone ID : "..id) end fibaro:call(id, "sendPush", message) end -- Envoi Email elseif notif == "email" and userID then for _, id in ipairs(userID) do if debug then Message("grey", "Send Email user ID : "..id) end fibaro:call(id, "sendEmail", "HC2 Watchdog", message) end -- Envoi SMS elseif notif == "sms" and sms then if debug then Message("grey", "Send SMS : VD_ID="..(sms["VD_ID"] or 0).." VD_Button="..(sms["VD_Button"] or "0").." VG_Name="..(sms["VG_Name"] or "")) end fibaro:setGlobal(sms["VG_Name"], message) if sms["VD_ID"] and tonumber(sms["VD_ID"])>0 and sms["VD_Button"] and tonumber(sms["VD_Button"])>0 then fibaro:call(sms["VD_ID"], "pressButton", sms["VD_Button"]) end end end else Message("orange", "Warning : no notification options given") end end -- -- Restart function -- function Restart(type, id, restart, notification, reason) Message("blue", 'Restart '..type..'('..id..')') -- Prepare API URL local getURL = "" local putURL = "" if type:lower() == "scene" then getURL = 'http://127.0.0.1:11111/api/scenes/'..id putURL = 'http://127.0.0.1:11111/api/scenes/'..id elseif type:lower() == "vd" then getURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id putURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id end -- Load VD/Scene local httpClient = net.HTTPClient() httpClient:request(getURL, { success = function(response) if response.status == 200 then local jsonTable = json.decode(response.data) local name = jsonTable.name or "" if restart and restart == true then -- Add new line at end of scene lua code if type:lower() == "scene" and jsonTable.lua then jsonTable.lua = jsonTable.lua .. "\n" response.data = json.encode(jsonTable) end -- Save VD/Scene httpClient:request(putURL, { success = function(response) if response.status == 200 then Message("green", type.."("..id..") successfully restarted") Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") a été redémarré : "..(reason or "???"), notification) else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'PUT', -- headers = { -- ["content-type"] = 'application/x-www-form-urlencoded;' -- }, data = response.data } }) else Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") doit être redémarré manuellement : "..(reason or "???"), notification) end else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'GET' } }) end -- function -- -- Check function -- function Check(interval) Message(nil, "Check") -- Browse VD/Scene list local httpClient = net.HTTPClient() local elements = #watchdog for i = 1, elements do -- Initialization local countscene_found = false if debug then Message(nil, "Check : type="..watchdog[i].type.." id="..watchdog[i].id) end -- Check number of running scene instances if watchdog[i].type:lower() == "scene" and watchdog[i].count and watchdog[i].count > 0 then local countScenes = fibaro:countScenes(watchdog[i].id) if countScenes < watchdog[i].count then Message("orange", watchdog[i].type..'('..watchdog[i].id..') '..countScenes..' running instance') countscene_found = true Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, countScenes..' instance') elseif debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') '..countScenes.." running instance") end end if countscene_found == false then -- Do not enter this loop if scene has already been restarted -- Prepare API URL local getURL = "" if watchdog[i].type:lower() == "scene" then getURL = "http://127.0.0.1:11111/api/scenes/"..watchdog[i].id.."/debugMessages" elseif watchdog[i].type:lower() == "vd" then getURL = "http://127.0.0.1:11111/api/virtualDevices/"..watchdog[i].id.."/debugMessages/0" else Message("red", "Error : unknown type value") end if getURL ~= "" then if debug then Message("grey", getURL) end -- Load VD/Scene debug messages httpClient:request(getURL, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) local current_timestamp = os.time() local oldest_timestamp = current_timestamp local match_found = false local no_match_found = false local reason = "" -- Reverse browsing of debug messages for j = #jsonTable, 1, -1 do oldest_timestamp = jsonTable[j].timestamp -- Check if debug message match lookup string within allowed interval if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and jsonTable[j].txt:match(watchdog[i].match.text) then if jsonTable[j].timestamp > current_timestamp - watchdog[i].match.interval then if debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].match.text..'"') end match_found = true end end -- Check if debug message match forbidden string if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and jsonTable[j].txt:match(watchdog[i].no_match.text) then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].no_match.text..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end if watchdog[i].no_match.type and watchdog[i].no_match.type ~= "" and jsonTable[j].type == watchdog[i].no_match.type then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found type "'..watchdog[i].no_match.type..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end end -- for if debug and oldest_timestamp > current_timestamp - watchdog[i].match.interval then Message("grey", watchdog[i].type..'('..watchdog[i].id..') oldest debug timestamp more recent than interval') end -- Restart VD/Scene if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and match_found == false and oldest_timestamp < current_timestamp - watchdog[i].match.interval then Message("orange", watchdog[i].type..'('..watchdog[i].id..') String "'..watchdog[i].match.text..'" not found') reason = 'Chaine « ' .. watchdog[i].match.text .. ' » non trouvée' if #jsonTable > 0 then reason = reason .. ', dernier message : ' .. os.date('%H:%M:%S', (jsonTable[#jsonTable].timestamp or 0)) .. ' « ' .. (jsonTable[#jsonTable].txt or "<nil>") .. ' »' end Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) --if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and no_match_found == true then elseif no_match_found == true then Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) end else Message("red", "Error : empty response") end else Message("red", "Error : status=" .. tostring(response.status)) end end, error = function(err) Message("red", 'Error : ' .. err) end, options = { method = 'GET' } }) end end end -- for -- Wait if interval and interval > 0 then setTimeout(function() Check(interval) end, interval*1000) end end -- function -- -- Main loop -- local trigger = fibaro:getSourceTrigger() if trigger["type"] == "autostart" then Message(nil, "Watchdog instance autostart") -- Check function call delayed to prevent killing all other scenes not already started right after HC2 boot setTimeout(function() Check(intervalle) end, delay*1000) else Message(nil, "Watchdog instance manual launch") -- Call Check function Check(nil) end . Le paramétrage du script s'effectue dans les quelques lignes situées sous le commentaire "User variables" : intervalle : durée entre 2 vérifications delay : délai avant la première vérification. En effet, cette scène ayant la propriété autostart afin de démarrer automatiquement au boot de la box, le risque est de démarrer avant les autres Scène/VD, et de forcer un redémarrage de ceux-ci alors qu'ils n'ont pas encore effectivement démarré. Ce délai laisse donc aux autres Scène/VD le temps de démarrer et de s'initialiser proprement. watchdog : tableau dont chaque ligne représente une Scène ou un Virtual Device à monitorer : type : "Scene" ou "VD" id : valeur numérique représentant l'ID de la Scène ou VD à monitorer match : texte qui doit être trouvé pendant un certain laps de temps afin de confirmer le bon fonctionnement du VD/Scène. Cela correspond typiquement à un message affiché cycliquement à intervalle régulier. Les 2 champs suivants doivent être renseignés pour que la condition soit prise en compte (condition ET) : text : chaine de caractères à trouver interval : durée en secondes no_match : texte qui ne doit pas être trouvé, sous peine de considérer le VD/Scène comme planté. Cela correspond typiquement à un message d'erreur LUA qui entraine le plantage du script. A noter que la condition no_match à priorité sur la condition match, c'est à dire que si le texte recherché par no_match est détecté, le VD/Scène sera redémarrer même si le texte recherché par match a été détecté. L'un ou l'autre des 2 champs suivants peuvent être renseignés pour que la condition soit prise en compte (condition OU) : text : chaine de caractères à trouver type : "ERROR" correspond aux messages affichés en rouge dans la fenêtre de Debug de l'interface HC2. A noter que jusqu'en v4.056, dans une scène une erreur LUA affichait le message en rouge avec le type "ERROR", tandis que depuis les Beta v4.057 et v4.058, cette même erreur s'affiche en blanc sans le type ERROR, par conséquent ce test ne fonctionne plus. En revanche, aucun changement de mode de fonctionnement concernant les Virtual Devices. count : valeur valable pour les scènes uniquement, et indiquant le nombre minimal d'instances qui doivent fonctionner pour confirmer le bon fonctionnement de la scène. Cela correspond typiquement à l'instance de type boucle infinie lancée en autostart. restart : true ou false afin de redémarrer le VD/Scène concerné, ou seulement envoyer une notification signalant qu'il faut le redémarrer manuellement. notification : liste séparée par des virgules des moyens de notifications à employer. userID : liste séparée par des virgules des ID des utilisateurs qui doivent recevoir des notifications par email (le mail est celui configuré pour chaque utilisateur dans le panneau de contrôle d'accès) smartphoneID : liste séparée par des virgules des ID des smartphones qui doivent recevoir des notifications push (à récupérer dans le toolkit de Krikroff ou via l'API : /api/iosDevices) sms : si vous avez une passerelle SMS sous Android avec SMS Gateway (ou équivalent) pilotée par un module virtuel, il faut renseigner ici les informations nécessaires : VD_ID : ID du module virtuel VD_Button : ID du bouton du module virtuel VG_Name : nom de la variable globale debug : true ou false afin d'activer l'affichage étendu dans la fenêtre de débugage de la scène. Exemple de paramètres : -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { {type = "Scene", id = 1, match = {text="", interval=0}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- Présence Lazer {type = "Scene", id = 2, match = {text="Last run", interval=2*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- DomoCharts {type = "Scene", id = 3, match = {text="Durée des traitements", interval=11*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- GEA {type = "VD", id = 1, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Surveillance Station {type = "VD", id = 2, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Clock Sync {type = "VD", id = 3, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- My Batteries {type = "VD", id = 4, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Evénements {type = "VD", id = 5, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Network Monitor {type = "VD", id = 6, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- GEA Alarm {type = "VD", id = 7, match = {text=" ", interval=30}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Sonos Player (Tk.isTraceEnabled = true) {type = "VD", id = 8, match = {text="Start main process", interval=31*60}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}} -- Freebox Serveur } local userID = {1} -- Email local smartphoneID = {1, 2} -- Push local sms = { ["VD_ID"] = 99, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false
  23. Punaise l'année dernière j'avais raté quasiment tous les bons plans, vendredi prochain faut que je me débrouille pour être devant le PC (et avec du temps libre) toute la journée !!
  24. Lazer

    Pressbutton

    oui je te conseille plutôt de concaténer avec le nom du VD. Sinon il est quasi certain que tu auras des boutons en double (un exemple : tous mes fils pilotes ont chacun un VD qui sont tous identiques) pour la variable globale, il y a l'astuce du json.encode() pour stocker un tableau dans la VG.
  25. Lazer

    Catcher Une Erreur Lua

    Je suis quand même assez lent (justement parce que j'apprends au fur et àmesure que je développe). Disons que ce n'est pas mon métier, mais ça aurait pu l'être. Sauf que 6 mois de stage quand j'avais 20 ans m'ont découragé d'en faire mon métier, je trouve ça trop prise de tête. Mais j'aime bien l'exercice àl'occasion
×
×
  • Créer...