Aller au contenu

JossAlf

Membres confirmés
  • Compteur de contenus

    1 078
  • Inscription

  • Dernière visite

  • Jours gagnés

    14

Tout ce qui a été posté par JossAlf

  1. Tiens je vois plus comment indiquer que le sujet est résolu ? (Faut que je me repose ...)
  2. Je crois que je vais me reposer un peu. Vous imaginez même pas les noeuds au cerveau que je viens de me faire. J'avais seulement rayé l'usage normal des variables globales à cause de ce foutu panneau de variables ... Vous imaginez programmer sans globale ?! Put... j'ai du mérite que mes codes tournent !!! Arf je flippe à l'idée d'en reprendre certains...
  3. Steven. T'es tordu hein ?! oups Je suis tordu mais toi aussi... -- J'en fait quoi moi de ce truc bizarre qui n'est même pas numérique.
  4. Merci encore à tous ! Tout s'éclaire enfin. En tout cas je me rends compte qu'avec mon incompréhension de l'utilisation du panneau de variables, je me bornais à déclarer toutes mes variables au fil de mon code en LOCALE et déclarais mes variables globales dans le panneau de variables !!! Pffff le boulet ! Tu m'étonnes que je me soit pris le mur hier soir ! Je vais pouvoir enfin revenir à une utilisation normale du LUA sans réinventer la portée des variables ! Je commençais à devenir fou là . Au sujet de la portée des variables, tout est là : http://www.luteus.biz/Download/LoriotPro_Doc/LUA/LUA_Training_FR/LUA_Scope_Variables.html Extrait : Portées des variables, définitionLes programmes sont morcelés en unités de code, comme pour les fonctions et les modules. Dans ces unités nous pouvons créer des variables et leur affecter des valeurs de sorte que nous puissions traiter des données et faire que le programme exécute une tâche donnée. Pour un certain nombre de raisons (conflits de noms, information cahée, etc...) nous pouvons vouloir isoler des variables dans les unités. Nous pouvons également vouloir créer des variables provisoires pour une tâche qui peuvent être supprimées une fois celle-ci terminée. Le terme "unité" est peu un vague. Nous employons le terme portée des variables pour décrire le jeu de code dans lequel un ensemble de variables sont disponible. Les variables auxquels nous avons accès sont dites visibles. La portée d'une variable est le bloc contenant le code dans lequel elle est visible. Les portées sont créées et détruites pendant que le programme exécute ces blocs de code. Les variables contenues dans ces blocs sont créées et détruites selon les règles décrites ci-après. Quand nous écrivons un bloc et une nouvelle portée nous écrivons une portée locale. Les portées externes sont visibles des portées locale mais pas le contraire.
  5. Oui c'est perturbant du coup le côté permissif... j'avais pas mesuré tout la portée de la chose...
  6. Merci Steven , Krikroff et Tom. Me voilà rassuré. Il faut seulement que je détruise tous les schèmes* que j'avais mis en place dans mon esprit depuis hier !!! * Larousse : Ensemble de concepts permettant de se faire une image de la réalité en résumant les éléments disparates de cette réalité à l'aide d'instruments fournis par la raison.
  7. En fait toute mon incompréhension vient de ce panneau de variables ! Je croyais que les variables globales ne pouvaient être créées QUE depuis ce panneau sous la HC2. Et que toutes les autres variables créées au sein du code ne pouvaient être QUE LOCALES ! Ben là j'ai fait fort moi ! Je commençais à me dire que c'était super alambiqué comme gestion des variables...
  8. ok ! Donc la valeur d'une variable stockée dans la base de la HC2 s'obtins par fibaro:getGlobalValue("player") Alors que la valeur d'une variable globale créée dans un code s'obtient comme une variable locale ? fibaro:debug(player) Peut donc s'employer pour afficher le contenu d'une variable locale et globale créée dans un code !
  9. Maintenant que j'ai compris, je trouve ça super subtile en fait : local player = "001" fibaro:debug(player) if 0 == 0 then local player = "002 " fibaro:debug(player) end fibaro:debug(player) donne ça au debug [DEBUG] 13:20:44: 001 [DEBUG] 13:20:44: 002 (création d'une nouvelle variable au sein du if qui n'est pas la même que celle créée à la ligne 2) [DEBUG] 13:20:44: 001 (on reste sur la valeur donnée lors de la création ligne 2) On voit que l'on a 2 variables locales player qui n'ont pas les mêmes valeurs ! Alors que ça : local player = "001" fibaro:debug(player) if 0 == 0 then player = "002 " fibaro:debug(player) end fibaro:debug(player) Donne ce résultat au début : [DEBUG] 13:22:55: 001 [DEBUG] 13:22:55: 002 [DEBUG] 13:22:55: 002 On voit que l'on a bien qu'une variable locale et enfin ça : --local player = "001" --fibaro:debug(player) if 0 == 0 then local player = "002 " fibaro:debug(player) end fibaro:debug(player) Retourne au debug : [DEBUG] 13:25:53: 002 [ERROR] 13:25:53: line :debug (arg 2), expected 'string const &' got 'nil' Car on a créé à la volée un variable locale qui n'existe que entre IF et END ​Et que le dernier debug cherche une variable LOCALE qui n'a jamais été déclarée avant le IF OUF... je crois que j'ai compris !
  10. Bon alors dernière question : if SqueezeNom == 'Cuisine' then player = "001 " elseif SqueezeNom == 'Salon' then player = "002 " end fibaro:debug(fibaro:getGlobalValue("player")) -- variable globale fibaro:debug(player) -- pas bon -> génère une erreur parce que player en local n'existe pas ! D'après ce code (comme je n'ai pas déclaré de variable locale) je n'ai qu'une variable GLOBALE créée à la volée. Voici ma question : Je croyais qu'il fallait passer par le panneau de gestion des variables pour créer les GLOBALES (à moins que ce ne soit que pour pouvoir gérer visuellement leur valeur) ? Celle-ci n'apparaitra d'ailleurs pas sur le panneau ? Je sais je suis compliqué...
  11. wouhou !
  12. J'avais aussi un problème de portée au début. Voici ce que je disais à l'époque : J'ai réussi à gagner au moins 50 mètres (en milieu hostile car à travers un portail à barreaux en fer, une forte densité de fils électriques et téléphoniques au-dessus de moi dans la rue et plusieurs voitures entre moi et la zibase -> hostile je vous dis ). En conclusion j'ai une portée de plus de 50 mètres avec le creasol. largement suffisant car mon portail s'ouvre vite. Donc pour augmenter la portée j'ai réglé le niveau de puissance sur 10mW au lieu du 10µW par défaut. Je ne sais pas si c'est ce que tu as fait. Voici la procédure suivie : Pour celà il faut alimenter le creasol (Ben oui c'est mieux) puis : 1) Appuyer 8 fois sur le petit bouton, 2) Laisser clignoter le creasol (il indique le réglage actuel - d'ailleurs le mien était réglé en 100µW au lieu d'être sur 10µW par défaut ?!) 3) Appuyer 4 fois sur le bouton (pour paramétrer les 10mW) 4) Attendre dans les 5 secondes ... 5) Couper l'alimentation et rebrancher et tester la distance.
  13. Bon je pense que je commence à comprendre mais il me reste un doute... Je reprends pour être certain : local player = nil if SqueezeNom == 'Cuisine' then player = "001 " elseif SqueezeNom == 'Salon' then player = "002 " end fibaro:debug(player) Ce code signifie : Ligne 2 : Je crée une variable locale appelée "player" Ligne 4 : Si SqueezeNom vaut "Cuisine" alors Ligne 5 : ma variable (locale qui valait nil) se voit affectée maintenant "001" Ligne 6 : mais si SqueezeNom vaut "Salon" alors Ligne 7 : ma variable (locale qui valait nil) se voit affectée maintenant "002" Ligne 8 : fin Ligne 10 : Affiche en debug la valeur de ma variable locale player -> soit 001 si SqueezeNom = Cuisine ; soit 002 si SqueezeNom = Salon et Nil si squeezeNom est mal renseignée. C'est bien ça ? Si j'avais oubliée la ligne 2 "local player = nil", la HC2 aurait interprété les lignes 5 et 6 comme la création d'une variable GLOBALE appelée player. Alors que là on utilise player comme variable LOCALE. C'est bien ça ? PS : désolé mais quand je fais le boulet je fais pas semblant...
  14. Merci Steven. Est-ce que dans ton exemple suivant on est en variable locale tout le temps ? Autrement dit : est-ce que le fait de l'avoir déclaré player en variable local par local player = nil permet d'utiliser "player" dans et en dehors de If (true) ... end ou cela ne change rien à mon problème ?
  15. Merci Cédric. Envoyé de mon iPhone àl'aide de Tapatalk
  16. Bon alors j'ai trouvé ! Le problème venait du mot "local" avant le nom de la variable "player" !! Apparement ça ne plaisait pas à la HC2 ?! Donc ce code est faux et retourne une erreur sur le second fibaro:debug(player) if 0 == 0 then local player = "OK" fibaro:debug(player) end fibaro:debug(player) En revanche ce code est bon et retourne bien OK sur les 2 debug. if 0 == 0 then player = "OK" fibaro:debug(player) end fibaro:debug(player) On peut donc bien modifier la valeur d'une variable locale avec un simple IF... Je me suis donc pris la tête pour une erreur de syntaxe !!! Je suis passé par une variable globale inutile ...
  17. Je vais sur le tchat si tu veux échange gare sur ces variables locales...
  18. J'avais eu de lui la même réponse quand je m'interrogeais sur l'impacts des mains loop
  19. Merci Tom. Je comprends mieux la nécessité de passer par une variable globale. Mais ça reste un peu ésotérique comme fonctionnement. Je m'y pencherai plus en profondeur. Je n'aime pas rester dans le flou ... Pour les elsif, je ne les ai pas utilisés sciemment car j'avais cru lire quelque part que ça ralentissait le code ?! Mais je ne sais pas où j'ai lu ça ? À confirmer ou infirmer donc En tout cas, Mon module virtuel fonctionne parfaitement bien et me facilite la vie (pour confirmer la bonne réception des ordres) Ça me fera un super complément au GEA de Steven.
  20. Intercom requires Home Center 3.902+ Même pas la 4 ?! Ils auraient pu faire une effort
  21. Je souhaitais me simplifier la vie et pouvoir confirmer un ordre par TTS sur mes squeezebox (ex l'allumage du fer à repasser depuis le second alors qu'il est au sous-sol). J'en ai 5 (Cuisine, Salon, Garage, Chambre du Haut et Chambre du Bas). J'ai donc fait un module virtuel "EmissionSqueeze" qui me permet d'émettre une phrase depuis n'importe qu'elle scène (ou bouton) en 5 lignes ! Voici le code qui vous permettra d'appeler ce module virtuel en 4 ligne depuis n'importe où : -- Faire un copier/coller de ce code dans le bouton -- depuis lequel on souhaite diffuser un message -- Le niveau sonore est attribué à chaque squeeze individuellement -- à la suite du nom avec comme valeur de 01 à 99 (pas 100 ! on doit rester sur 2 chiffres) -- SqueezeNom -> Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> Texte pour la TTS (inutile de mettre des %20) --Liste des squeezes sous la forme {"Cuisine30","Garage80","Salon60","ChambreH30","ChambreB50"} local ListeSqueeze = {"Cuisine55","Garage99","Salon60","ChambreH30","ChambreB30"} fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze)) -- Taper le message fibaro:setGlobal('Messager' , "Ouverture du portail") fibaro:call(144, "pressButton", "1"); -- fin annonce Squeezebox Voici le code principal du bouton 1 du module virtuel 144 : -- JossAlf ; 02/07/14 (V2.1) 21/06/14 (V2.0) 17/06/14 (V1.3) ; 22/05/14 (V1.1) ; 23/05/14 (V1.2) -- V2.1 : Ajout du réglage individuel duniveau sonore pour chaque squeeze en ajoutant 2 chiffre après le nom -- V2.0 : Simplification du code et possibilité d'allumer 1,2,3,4 ou 5 squeeze. -- Scène permettant simplifier la diffusion de messages sur 1 ou plusieurs squeezeboxes. -- Nécessite de créer les Variables Globales : SqueezeNom ; Messager -- (Ne pas utiliser dans une scène le json bug) -- l'appel de module virtuel se fera dans un autre module virtuel de façon simple -- en affectant les valeurs aux variables Globales -- puis en simulant le clic sur un bouton : exemple -> fibaro:call(144, "pressButton", "1"); local ListeSqueeze = fibaro:getGlobal("SqueezeNom"); local TableauSqueezeNom = json.decode(ListeSqueeze); local player = nil -- Adresse IP du Logitech Media Server local ipadd = "192.168.0.46" -- le port du serveur local portno = 9090 local Squeezers = { ['Cuisine'] = "00:04:xx:xx:xx:00 ", ['Salon'] = "00:04:xx:xx:xx:3e ", ['ChambreB'] = "00:04:xx:xx:xx:fe ", ['ChambreH'] = "00:04:xx:xx:xx:ba ", ['Garage'] = "00:04:xx:xx:xx:bc ", } --On allume toutes les squeezes for i = 1, #TableauSqueezeNom do --on récupère uniquement le nom en retirant les 2 derniers caractères qui correspondent au niveau sonore local player = string.sub(TableauSqueezeNom[i], 1 , -3) fibaro:debug(player) local player = Squeezers[player] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- on règle le son -- on prend que les 2 dernier caractères qui correspondent au niveau sonore. local VolumeSon = string.sub(TableauSqueezeNom[i], -2) local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end -- on laisse une seconde pour laisser le temps à toutes les squeeze de s'allumer fibaro:sleep(1000) -- On envoie le message en utilisant la première radio local player = string.sub(TableauSqueezeNom[1], 1 , -3) local player = Squeezers[player] local notification = fibaro:getGlobalValue('Messager') -- On remplace les espaces par des %20 local notification = string.gsub((notification)," ", "%%20"); fibaro:debug(notification) -- Attention google ne fonctionne plus il vaut mieux utiliser VoiceRSS pour le TTS -- local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=" .. notification; -- Voicerss TTS local cmnd = "playlist play http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src=" .. notification; local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- OFF des squeezeBoxs après 10 secondes fibaro:sleep(20*1000) -- on éteint les squeezes for i = 1, #TableauSqueezeNom do fibaro:debug("debut de la boucle") local player = string.sub(TableauSqueezeNom[i], 1 , -3) local player = Squeezers[player] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end MAJ : Simplification du code avec une boucle et le passage des "paramètres" sous forme de variable traduite en tableau en passant par un json. On peux maintenant choisir d'émettre sur une ou plusieurs radio en les nommants. Attention à bien renseigner le nom de votre squeeze avec le niveau sonore collé (exemple "Cuisine80") si non ... Pour la diffusion d'un message/fichier MP3, se référer au message 20 de ce sujet. PS : Merci à Steven pour le coup du Json (pour obtenir un tableau) et pour Shad et la boucle "for". MAJ2 : Evolution du code afin de choisir individuellement le niveau sonore des squeezer. MAJ3 : Google ne fonctionne plus en lien directe (à la ligne 62) Je l'ai remplacé par VoiceRSS (ligne 65) qui fait très bien le travail http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src= J'en parle ici : #80
  22. Salut Tom ! Content de te revoir. Ca faisait un bail ! Je souhaitais assigner le numéro MAC de mes squeezebox en fonction du nom de la pièce passée àune variable locale. Comme c'est la première fois que j'utilise un if pour modifier la valeur d'une variable locale, je ne savais pas qu'après un then, il fallait une fonction !!! Mais ce que je ne comprends pas c'est pourquoi en dehors d'un "if then end", local player = "00:04:20:2c:35:bc " fonctionne comme je le souhaite. J'ai fait un petit MV pour me simplifier les choses et diffuser rapidement des messages. Tiens je vais le mettre en ligne. Comme ça il pourra être amélioré En tout cas merci pour ton aide. MAJ : Lien vers le module virtuel
  23. J'ai corrigé le problème en passant par une variable globale "de transition" comme ça : local SqueezeNom = "Cuisine" if SqueezeNom == 'Cuisine' then fibaro:setGlobal('Player' , "00:04:20:2b:81:00 " ) end if SqueezeNom == 'Salon' then fibaro:setGlobal('Player' , "00:04:20:29:bb:3e ") end if SqueezeNom == 'ChambreB' then fibaro:setGlobal('Player' , "00:04:20:2c:0b:fe ") end if SqueezeNom == 'ChambreH' then fibaro:setGlobal('Player' , "00:04:20:2c:35:bc ") end local player = fibaro:getGlobalValue("Player") fibaro:debug(player) Mais ça remet en question ma compréhension des variables locales que je pensaient valable dans tout le code du module virtuel ou de la scène ?! Si quelqu'un peux me dire si c'est normal ou si c'est un bug. Merci.
  24. Bonjour, J'ai un problème avec l'utilisation d'une variable locale... Je pensais pouvoir affecter une valeur à cette variable comme suit : local SqueezeNom = "Cuisine" if SqueezeNom == 'Cuisine' then local player = "00:04:20:2b:81:00 " fibaro:debug(player) end if SqueezeNom == 'Salon' then local player = "00:04:20:29:bb:3e " end if SqueezeNom == 'ChambreB' then local player = "00:04:20:2c:0b:fe " end if SqueezeNom == 'ChambreH' then local player = "00:04:20:2c:35:bc " end fibaro:debug(player) if SqueezeNom == 'ChambreH' then local player = "00:04:20:2c:35:bc " end fibaro:debug(player) Le premier debug (ligne 6) me donne bien "00:04:20:2b:81:00" Mais le second (ligne 26) me retourne une erreur : [ERROR] 16:53:07: line :debug (arg 2), expected 'string const &' got 'nil' Je comprends pas... C'est comme si la variable locale "player" est tellement localisée qu'elle n'existe que dans le IF .. end ? HELP !!
  25. Je parle de la HC qui semble intégrer un processus d'optimisation automatique. Le maillage sur zibase peut être optimisé àla main.
×
×
  • Créer...