Page 1 sur 2

Comparaison d'un meme code DzEvent fais par moi meme et analyser ainsi qu'améliorer par Chat GPT, qu'en pensez vous

Publié : 14 janv. 2023, 04:34
par taz5962
Salut a tous,

Comme inscrit dans le titre, je souhaiterais que l'on analyse un code lua que j'ai créé a taton avec mes très maigres connaissances avec ces langages
J'ai demandé a un ami d’essayer de m'améliorer ce code disons le très basique,
Avant de l'utiliser j'aimerais en discuter avec les spécialistes présents ici

Voici mon code d'origine

Code : Tout sélectionner

return { active = true, logging = { level = domoticz.LOG_DEBUG,marker = 'Mini_Inter_LED_Lidl'},on = { devices = { 'Mini_Inter', 'LED_Lidl',},},      -- {validation du script {le script écrit dans les LOG_DEBUG de DomoticZ , -- nom du script='Mini_Inter_LED_Lidl'} {liste des devices{nom des devices='Mini_Inter', 'LED_Lidl'}}
	 execute = function ( domoticz, item)  domoticz.log ( "Mini_Inter : "..item.state)                                                           -- EXECUTER la fonction DomoticZ , -- VERIFIER l'état de Mini_Inter dans les logs DomoticZ
	    	  if item.state == 'simple_pression' then                                                                                            -- SI l'état de Mini_Inter passe a simple_pression ALORS
	    	     domoticz.log ( "simple_pression sur Mini_Inter > LED_Lidl = On")                                                                -- VALIDATION de simple_pression sur Mini_Inter dans les logs PASSE a la suite
	             domoticz.devices ( 'LED_Lidl').switchOn()                                                                                       -- ALLUMER  device LED_Lidl
	      elseif item.state == 'double_pression' then                                                                                            -- SINON SI l'état de Mini_Inter passe a double_pression ALORS
	             domoticz.log ( "double_pression sur Mini_Inter > LED_Lidl =")                                                                   -- VALIDATION de double_pression sur Mini_Inter dans les logs PASSE a la suite
	    	     domoticz.devices ( 'LED_Lidl')                                                                                                  -- REGLER device LED_Lidl (a définir)
              elseif item.state == 'longue_pression' then                                                                                            -- SINON SI l'état de Mini_Inter passe a longue_pression ALORS
                     domoticz.log ( "longue_pression sur Mini_Inter > LED_Lidl = Off")                                                               -- VALIDATION de longue_pression sur Mini_Inter dans les logs PASSE a la suite 
	    	     domoticz.devices ( 'LED_Lidl').switchOff()                                                                                      -- ETEINDRE device LED_Lidl
        end end}

Voici le code améliorer de mon ami

Code : Tout sélectionner

return {
    active = true,
    logging = {
        level = domoticz.LOG_DEBUG,
        marker = 'Mini_Inter_LED_Lidl'
    },
    on = {
        devices = { 'Mini_Inter', 'LED_Lidl' },
    },
    execute = function (domoticz, item)
        -- Si l'appareil Mini_Inter n'est pas présent, sortir de la fonction
        if (item.isDevice == false) then
            domoticz.log("Device Mini_Inter not found", domoticz.LOG_ERROR)
            return
        end

        -- Si l'appareil LED_Lidl n'est pas présent, sortir de la fonction
        if (domoticz.devices('LED_Lidl').isDevice == false) then
            domoticz.log("Device LED_Lidl not found", domoticz.LOG_ERROR)
            return
        end

        -- Si l'appareil LED_Lidl n'est pas un switch, sortir de la fonction
        if (domoticz.devices('LED_Lidl').switchType == nil) then
            domoticz.log("Device LED_Lidl is not a switch", domoticz.LOG_ERROR)
            return
        end

        -- Log l'état de Mini_Inter
        domoticz.log("Mini_Inter : " .. item.state)

        -- Si l'état de Mini_Inter est "simple_pression"
        if (item.state == 'simple_pression') then
            domoticz.log("Simple pression on Mini_Inter > LED_Lidl = On")
            domoticz.devices('LED_Lidl').switchOn()
            -- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
        -- Si l'état de Mini_Inter est "double_pression"
        elseif (item.state == 'double_pression') then
            domoticz.log("Double pression on Mini_Inter > LED_Lidl = ?")
            -- TODO: Ajouter le comportement souhaité pour l'état "double_pression"
        -- Si l'état de Mini_Inter est "longue_pression"
        elseif (item.state == 'longue_pression') then
            domoticz.log("Long pression on Mini_Inter > LED_Lidl = Off")
            domoticz.devices('LED_Lidl').switchOff()
        end
    end
}
Qu'en pensez vous et que changeriez vous ?

Re: Comparaison d'un meme code DzEvent fais par moi meme et améliorer par un ami, qu'en pensez vous

Publié : 14 janv. 2023, 08:40
par taz5962
bon déjà un peu pressé de tester je l'ai injecter en modifiant les bons devices car le matériel a un peu changé

et ben :o , il fonctionne bien :D

reste maintenant l'analyse des pros a ces langages présents ici ;)

Re: Comparaison d'un meme code DzEvent fais par moi meme et améliorer par un ami, qu'en pensez vous

Publié : 14 janv. 2023, 09:03
par Keros
Il y aurait ce bout de code qui pourrait être optimisé :

Code : Tout sélectionner

-- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
DzVent a une fonction native pour effectuer une action avec un délai : https://www.domoticz.com/wiki/DzVents:_ ... ggering.29

Faire des vérifications si l'objet est présent : si tu as des soucis avec ça oui.

Tu trouveras autant d'avis que de personnes. Je dirais que l'important dans un script c'est :
  • qu'il fonctionne
  • que tu puisses comprendre ce qui ce passe (débogage)
  • que tu puisses le comprendre rapidement quand tu reviens dessus 6 mois/1 an/2 an après

Re: Comparaison d'un meme code DzEvent fais par moi meme et améliorer par un ami, qu'en pensez vous

Publié : 14 janv. 2023, 13:51
par boum
Honnêtement, bof bof. On va faire une relecture du scipt pour montrer les petits soucis.

Code : Tout sélectionner

    on = {
        devices = { 'Mini_Inter', 'LED_Lidl' },
    },
Pourquoi vouloir déclencher le script sur changement du dispositif 'Led_lidl' ?
Le fait que ce soit un déclencheur n'est jamais utilisé plus loin. Il n'y a même pas d'erreur juste pasque les états possibles testés ne concernent pas la lampe, uniquement l'interrupteur.


Code : Tout sélectionner

        -- Si l'appareil Mini_Inter n'est pas présent, sortir de la fonction
        if (item.isDevice == false) then
            domoticz.log("Device Mini_Inter not found", domoticz.LOG_ERROR)
            return
        end
Commentaire erroné.
Programmation défensive inutile. Les seuls déclencheurs sont des dispositifs. Condition jamais réalisée.


Code : Tout sélectionner

        -- Si l'appareil LED_Lidl n'est pas présent, sortir de la fonction
        if (domoticz.devices('LED_Lidl').isDevice == false) then
            domoticz.log("Device LED_Lidl not found", domoticz.LOG_ERROR)
            return
        end
Programmation défensive erronée. Le script fera une erreur si le dispositif n'existe pas `devices()` renverra nil donc isDevice échouera.


Code : Tout sélectionner

       -- Si l'appareil LED_Lidl n'est pas un switch, sortir de la fonction
        if (domoticz.devices('LED_Lidl').switchType == nil) then
            domoticz.log("Device LED_Lidl is not a switch", domoticz.LOG_ERROR)
            return
        end
Programmation défensive pas super utile. Lors de la conception, pourquoi pas. Une fois que ça marche, peu de chance que cela ne change à moins que le dispositif ne soit supprimé (dans ce cas ça foire avant de générer l'erreur comme le point précédent) ou remplacé par autre chose qu'un interrupteur (pas très crédible).


Code : Tout sélectionner

        -- Log l'état de Mini_Inter
        domoticz.log("Mini_Inter : " .. item.state)
Bof. Ajouter en 2e paramêtre LOG_DEBUG peut-être. Pas utile en « production, » uniquement lors du développement du script.


Code : Tout sélectionner

        -- Si l'état de Mini_Inter est "simple_pression"
        if (item.state == 'simple_pression') then
            domoticz.log("Simple pression on Mini_Inter > LED_Lidl = On")
            domoticz.devices('LED_Lidl').switchOn()
Peut-être une piste d'amélioration ici. Vérifier d'abord l'état de la led pour choisir le comportement.


Code : Tout sélectionner

            -- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
Est-ce que ça marche au moins? Je n'ai vu nulle part la définition de LIGHT_bla et LIGHT_autre_bla.
Possiblement un message d'erreur dans les log. Soit le openURL ne marche pas, soit essai de concaténer nil.
La commande JSON avec `timer=` n'est pas documentée. D'où sort cette chose ?
Et puis plus simple d'écrire: domoticz.devices('LED_Lidl').switchOff().afterMin(delay)




Plus rien à dire pour le reste.
Après, tant que ça marche pourquoi pas. Mais ça fait du travail pour rien de vérifier à chaque fois que 2+2=4.

Re: Comparaison d'un meme code DzEvent fais par moi meme et améliorer par un ami, qu'en pensez vous

Publié : 14 janv. 2023, 15:55
par taz5962
Keros a écrit : 14 janv. 2023, 09:03 Il y aurait ce bout de code qui pourrait être optimisé :

Code : Tout sélectionner

-- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
ce morceau de code je l'ai viré car je n'ai pas besoin d'extinction après un délai d'attente

boum a écrit : 14 janv. 2023, 13:51 Honnêtement, bof bof. On va faire une relecture du scipt pour montrer les petits soucis.

Code : Tout sélectionner

    on = {
        devices = { 'Mini_Inter', 'LED_Lidl' },
    },
Pourquoi vouloir déclencher le script sur changement du dispositif 'Led_lidl' ?
Le fait que ce soit un déclencheur n'est jamais utilisé plus loin. Il n'y a même pas d'erreur juste pasque les états possibles testés ne concernent pas la lampe, uniquement l'interrupteur.
Donc tu supprimerais LED_Lidl car ce n'est pas un déclencheur ?

Code : Tout sélectionner

        -- Si l'appareil Mini_Inter n'est pas présent, sortir de la fonction
        if (item.isDevice == false) then
            domoticz.log("Device Mini_Inter not found", domoticz.LOG_ERROR)
            return
        end
Commentaire erroné.
Programmation défensive inutile. Les seuls déclencheurs sont des dispositifs. Condition jamais réalisée.
Donc tu supprimerais cette section ?

Code : Tout sélectionner

        -- Si l'appareil LED_Lidl n'est pas présent, sortir de la fonction
        if (domoticz.devices('LED_Lidl').isDevice == false) then
            domoticz.log("Device LED_Lidl not found", domoticz.LOG_ERROR)
            return
        end
Programmation défensive erronée. Le script fera une erreur si le dispositif n'existe pas `devices()` renverra nil donc isDevice échouera.
Donc tu supprimerais cette section ?

Code : Tout sélectionner

       -- Si l'appareil LED_Lidl n'est pas un switch, sortir de la fonction
        if (domoticz.devices('LED_Lidl').switchType == nil) then
            domoticz.log("Device LED_Lidl is not a switch", domoticz.LOG_ERROR)
            return
        end
Programmation défensive pas super utile. Lors de la conception, pourquoi pas. Une fois que ça marche, peu de chance que cela ne change à moins que le dispositif ne soit supprimé (dans ce cas ça foire avant de générer l'erreur comme le point précédent) ou remplacé par autre chose qu'un interrupteur (pas très crédible).
Donc tu supprimerais cette section ?

Code : Tout sélectionner

        -- Log l'état de Mini_Inter
        domoticz.log("Mini_Inter : " .. item.state)
Bof. Ajouter en 2e paramêtre LOG_DEBUG peut-être. Pas utile en « production, » uniquement lors du développement du script.

Code : Tout sélectionner

            -- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
Est-ce que ça marche au moins? Je n'ai vu nulle part la définition de LIGHT_bla et LIGHT_autre_bla.
Possiblement un message d'erreur dans les log. Soit le openURL ne marche pas, soit essai de concaténer nil.
La commande JSON avec `timer=` n'est pas documentée. D'où sort cette chose ?
Et puis plus simple d'écrire: domoticz.devices('LED_Lidl').switchOff().afterMin(delay)
comme j'ai pu répondre a Keros ce morceau de code je l'ai viré vu que je n'ai pas besoin de délai

Re: Comparaison d'un meme code DzEvent fais par moi meme et améliorer par un ami, qu'en pensez vous

Publié : 14 janv. 2023, 21:39
par boum
Oui, je ferai plus court:

Code : Tout sélectionner

return {
    active = true,
    logging = {
        -- level = domoticz.LOG_DEBUG, -- décommenter pour débug
        marker = 'Mini_Inter_LED_Lidl'
    },
    on = {
        devices = { 'Mini_Inter' },
    },
    execute = function (domoticz, item)
	local led = domoticz.devices('LED_Lidl')

        -- Log l'état courant en débug
        domoticz.log("Avant LED_Lidl : " .. led.state, domoticz.LOG_DEBUG)
        domoticz.log("Mini_Inter : " .. item.state, domoticz.LOG_DEBUG)

        -- Si l'état de Mini_Inter est "simple_pression"
        if (item.state == 'simple_pression') then
            domoticz.log("Simple pression on Mini_Inter > LED_Lidl = On")
            led.switchOn().checkFirst()
        -- Si l'état de Mini_Inter est "double_pression"
        elseif (item.state == 'double_pression') then
            domoticz.log("Double pression on Mini_Inter > LED_Lidl = ?")
            -- TODO: Ajouter le comportement souhaité pour l'état "double_pression"
        -- Si l'état de Mini_Inter est "longue_pression"
        elseif (item.state == 'longue_pression') then
            domoticz.log("Long pression on Mini_Inter > LED_Lidl = Off")
            led.switchOff().checkFirst()
        end

    end
}
Donc tu supprimerais LED_Lidl car ce n'est pas un déclencheur ?
Exactement. En plus quand tu appuies sur l'interrupteur, le script change l'état le la led. Ce qui déclenche le script. Qui ne fait rien (c'est déjà ça, mais il y aurait pu y avoir des effets de bord).
[...]
Donc tu supprimerais cette section ?
[...]
Donc tu supprimerais cette section ?
[...]
Donc tu supprimerais cette section ?
Oui. Écrire des informations dans les logs pendant le développement du script, pourquoi pas.
Mais ici, les conditions sont soit erronées soit inexactes et ne protègent pas le script de problèmes si un ou les deux dispositifs sont supprimés.
De plus, si on appelle domoticz.devices("coincoinblapaf"), je crois qu'on obtient déjà un message comme quoi aucun dispositif n'a ce nom.

Code : Tout sélectionner

            -- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
Est-ce que ça marche au moins? Je n'ai vu nulle part la définition de LIGHT_bla et LIGHT_autre_bla.
Possiblement un message d'erreur dans les log. Soit le openURL ne marche pas, soit essai de concaténer nil.
La commande JSON avec `timer=` n'est pas documentée. D'où sort cette chose ?
Et puis plus simple d'écrire: domoticz.devices('LED_Lidl').switchOff().afterMin(delay)
comme j'ai pu répondre a Keros ce morceau de code je l'ai viré vu que je n'ai pas besoin de délai
Je suis quand même curieux de savoir d'où sort cette ligne qui sans autre modification n'a aucune chance de marcher :mrgreen:

Re: Comparaison d'un meme code DzEvent fais par moi meme et améliorer par un ami, qu'en pensez vous

Publié : 20 janv. 2023, 01:17
par taz5962

Code : Tout sélectionner

            -- Définir un minuteur pour éteindre l'ampoule après LIGHT_DELAY secondes
            domoticz.openURL("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=".. LIGHT_SWITCH_IDX .. "&switchcmd=Off&level=0&passcode=1234&timer="..LIGHT_DELAY)
Est-ce que ça marche au moins? Je n'ai vu nulle part la définition de LIGHT_bla et LIGHT_autre_bla.
Possiblement un message d'erreur dans les log. Soit le openURL ne marche pas, soit essai de concaténer nil.
La commande JSON avec `timer=` n'est pas documentée. D'où sort cette chose ?
Et puis plus simple d'écrire: domoticz.devices('LED_Lidl').switchOff().afterMin(delay)
comme j'ai pu répondre a Keros ce morceau de code je l'ai viré vu que je n'ai pas besoin de délai
Je suis quand même curieux de savoir d'où sort cette ligne qui sans autre modification n'a aucune chance de marcher :mrgreen:
[/quote]

je ne saurais te dire ce que cette tempo viens faire la, car elle n'était pas la d'origine sur mon script

par contre il y a juste une chose que j'ai annoncé dans le poste d'origine qui n'est pas vrai du tout :mrgreen:
c'est quand j'ai dis qu'un de mes ami avait analyser et m'a donné un code normalement amélioré

en faites pour vous sortir ce script j'ai fais appelle a ChatGPT
on arrête pas d'en parler partout alors je me suis dis pourquoi pas essayer de le lancer sur l'analyse et l'amélioration du script que j'avais tant bien que mal écrit

j’attends vos retour ;)

Re: Comparaison d'un meme code DzEvent fais par moi meme et analyser ainsi qu'améliorer par Chat GPT, qu'en pensez vous

Publié : 20 janv. 2023, 10:13
par boum
Je m'en doutais un peu. Un script généré par chatgpt a aussi été montré sur le forum anglophone.

Je n'en étais pas sûr à 100%, les humains aussi écrivent des programmes qui ne marchent pas :lol: (c'est d'ailleurs ça que le bot reproduit.)

Même constat ici que là-bas. Ça marchotte. Mais je ne m'inquiète pas encore pour mon boulot de dev logiciel :mrgreen:

Re: Comparaison d'un meme code DzEvent fais par moi meme et analyser ainsi qu'améliorer par Chat GPT, qu'en pensez vous

Publié : 20 janv. 2023, 12:38
par Neutrino
Pour l'avoir tester aussi, c'est très bien pour trouver un algorithme, mais pas terrible pour du code pur.

Re: Comparaison d'un meme code DzEvent fais par moi meme et analyser ainsi qu'améliorer par Chat GPT, qu'en pensez vous

Publié : 21 févr. 2023, 15:13
par taz5962
@Neutrino,

pour quelqu'un qui ne sait pas coder et surtout ces subtilités ça dégraisse pas mal
en la mettant dans certaine situation explicite son boulot est plutôt pas mal pour avoir un fil conducteur

@boum,

pour des non dev et autodidacte qui commence a peine a effleurer le code c'est une grande aide