Gérer les segments

Bonjour à tous,
Je cherche à améliorer mon plugin wled en gérant les segments (wled permet de diviser un ruban led en plusieurs segments et de commander chaque segment indépendamment).
En fait le code actuel utilise déjà les segments car certaines commandes (effet, vitesse, …) sont définies au niveau segment mais pour le moment dans le plugin elles ne s’adressent qu’au « segment principal » qui correspond à tout le ruban.
J’ai réfléchi et vu la structure de Jeedom, la seule solution possible me semble être de créer un objet Jeedom par segment lors de la découverte.
Mais mon problème c’est que dans l’api WLED coexistent des commandes au niveau segment et au niveau ruban entier.
Par exemple les commandes pour allumer, éteindre et luminosité (on, off, luminosité) agissent sur le ruban entier.
Par contre les commandes couleur et effet agissent sur un segment.
Ok pour les commandes définies au niveau du segment puisque j’ai un objet pour chaque segment tout va bien si je donne par exemple un ordre couleur c’est le segment en question qui prends la couleur désirée.
Mais par exemple si je donne l’ordre on ou off alors que la commande appartient à un objet Jeedom défini au niveau du segment en fait j’agis sur tous les segments du ruban. je me retrouve donc avec des commandes qui agissent sur plusieurs objets Jeedom cela ne me semble pas bien logique. Voyez-vous une solution ?

Salut,

Les segments sont dynamiques où prédéfini?

Je créerais un set de commandes qui sont utiles pour un segment par segment découvert sur le meme eqlogic et donc les commandes globales sont créés une fois, toujours sur le meme eqlogic

Les segments sont prédéfinis, plus précisément dans l’appli sur smartphone lorsqu’on donne les caractéristiques du ruban (type de led, nombre de leds, …) il y a une interface qui permet de définir les segments (led de début et de fin du segment, …). Mais pour le moment le plugin ne permet pas de les changer.
L’API JSON (il y a aussi une API HTTP nettement moins puissante) est ici :
https://kno.wled.ge/interfaces/json-api/
Mais je viens de comprendre en la relisant que les ordres on et off (luminosité je ne sais pas à vérifier) peuvent aussi agir au niveau segment. On se retrouve donc avec 2 types d’ordres on et off : niveau ruban et niveau segment.

En fait je dois avouer que mon usage du plugin est vraiment basique (et je n’utilise pas les segments) : j’ai des rubans led (dans des profilés alu) un peu partout dans le salon (au dessus de chaque meuble et de chaque coffre de volet roulant tourné vers le plafond, au dessous de chaque meuble devant la plinthe tourné vers le carrelage, …) ils sont groupés dans une pièce nommée « disco » et quand je dis « Dis Siri allume disco » çà déclenche un effet rainbow dans toute la pièce :smiley: et çà me rappelle ma jeunesse en boite :smiley:

Quel timing incroyable @vedrine !!!

En plein projet pour la réalisation d’un petit device ESP/wLed qui doit me permettre de faire un feedback lumineux sur l’état de mes équipements connectés à Jeedom. Je découvrais il y à 5 jours votre super plug-In. Mais lisais avec tristesse qu’il ne gérait pas les segments.

En effet dans mon projet chaque led indique individuellement l’état d’un équipement different sur un seul ESP/wLed avec un seul et meme ruban led.

IMG_6613 - Moyenne

IMG_6614 - Moyenne

Voila donc 5 jours que je tente de piloter malgré tout le wLed avec des requêtes http qui pointent sur des Presets de segments ciblés … mais j’arrive a saturation de la mémoire de l’ESP assez rapidement.

Du coups j’ai aussi tenté des requettes jSon type :

curl -X POST "http://192.174.0.75/json/state" -d '
{"seg":{"i":[0,8,"000000", 9,"00FF00", 12,"0000FF"]}}
' -H "Content-Type: application/json"

Mais ça ne fonctionne pas.

Du coups je suis bien content de lire votre post qui annonce la gestion des segments.
Bien hate de tester.

En attendant, si quelqu’un pouvait me dire ce que je fais de travers sur ma requête jSon API…
Ça me permettrait de poursuivre mon explo … en attendant l’upgrade du plug in … :pray:

Merci d’avance.

Si je comprends bien tu utilises le paragraphe " Per-segment individual LED control" de la page dont j’ai donné le lien plus haut
Je n’ai jamais utilisé la propriété « i » donc j’ai du mal à voir ce qui cloche dans ton appel d’autant que je trouve ce paragraphe peu clair puisqu’il semble dire qu’on peut donner plein de formes pour les leds concernées : index,color ou start, end, color ou encore start, color, color, color, … j’ai du mal à m’y retrouver.
J’ai poussé sur le market une version béta du plugin qui

  • Utilise uniquement l’API JSON (avant j’utilisais aussi l’API HTTP et c’était un préalable à la gestion des segments d’abandonner celle là)
  • Lors de la découverte crée un objet Jeedom par segment (dont le segment principal qui comprends toutes les leds reliées au contrôleur et qui a le numéro 0)
  • permet d’envoyer toutes les commandes qui étaient précédemment dans le plugin mais maintenant à chaque segment

Pour ton cas particulier cela ne va pas t’aider car tu veux contrôler led par led mais j’espère que ca va intéresser certains utilisateurs du plugin.
Si certains utilisateurs du plugin veulent m’indiquer quelles commandes supplémentaires il aimeraient voir ajouter au plugin , je verrai comment le faire. pour le moment je ne me suis pas intéressé aux palettes, au presets et autres mais je suis tout prêt à m’y mettre s’il y a de la demande.

Attention !

Les segments peuvent être variables …

Dans mon utilisation des presset, wLEd n’affiche que les segments dont il à besoin.

Par exemple j’ai un presset « titi / toto » qui utilise deux segments.

  • Un segment : id=1, name = « titi », Led range = 0 à 4
  • Un segment : id=2, name = « toto », Led range = 4 à 7

Et un autre preset « titi / tata » qui utilise

  • Un segment : id=1, name = « titi », Led range = 0 à 4
  • Un segment : id=3, name = « tata », Led range = 4 à 9

Si j’ active « titi / tata » Toto n’apparait plus dans la liste des segments.


Par contre, si ça peut aider, on peut générer des segments dans la commande du jSon.

C’est ce que je fait en modifiant les jSon des presets sur wLed:

Je fait un json qui specifie :

  • Un segment : id=1, name = « titi », Led range = 0 à 4 — Tel comportement A (Couleur dans mon cas)
  • Un segment : id=2, name = « toto », Led range = 4 à 9 — Tel comportement B
  • Un segment : id=3, name = « tata », Led range = 9 à 10 — Tel comportement C

Et les segments apparaissent comme par magie sur le board segment du wLed


Note pour la luminosité de chaque segment j’utilise la couleur rvb.
Si je veux les éteindre : je met #000000 ou plutôt [0,0,0]

Et je compte régler la luminosité générale avec la fonction « bri »
(Par exemple pour descendre la luminosité la nuit et l’augmenter en journée)
J’avais pensé utiliser votre plug-in pour ca justement.

Oui c’est ce que j’ai tenté d’utiliser …

Mais même sans utiliser le « i »
J’ai également tenté de copier coller tel quel le jSon qui est edité dans les preset

avec curl -X POST "http://192.168.0.38/json/state" -d ' en prefix
et ' -H "Content-Type: application/json" en sufix

Rien ne se passe.
J’ai l’impression que c’est la manière dont j’utilise le plug-in de scripts en jSon qui n’est pas bonne.

Les requêtes http d’activations de preset fonctionnent bien elle :

Mais je préfèrerait définir le setting du range des leds et des couleurs dans la requête Jeedom plutôt que d’appeler le preset du wLed
(Surtout que j’ai un bon nombre de preset à adresser et qu’au bout de 10 la mémoire du wLed semble saturer …)

En attendant je tente de réduire le code jSon des preset dans wLed à leur minimum pour pouvoir en mètre plus … Mais je préfèrerais déporter cette limitation mémoire sur Jdom du coups …

Merci de m’avoir signalé çà du coup mon idée de détecter les segments lors de la découverte et de créer un objet Jeedom par segment n’est pas bonne. Il faut que je reprenne mon code et que je suive l’idée de @Mips : un objet Jeedom par WLED et ensuite des commandes qui s’adresse a un segment donné mais je suis limité par les types de commandes Jeedom j’ai du mal à voir pour le moment comment gérer çà en dynamique pour pouvoir par exemple avoir une commande qui exécute segment 3 effet 5

Ton (ou tes contrôleurs) utilisent quel circuit ESP8266 ou ESP32 ? Apparemment cela change la capacité mémoire. je n’ai que des Quinled Dig-Uno avec des ESP32 mais aucun ESP8266.
Et je viens de recevoir un Quinled Dig-Quad pour un futur projet

J’ignorais que les segments autres que le 0 pouvait avoir un nom car dans l’appli IOS je n’avais pas vu qu’on pouvait cliquer sur le nom pour le changer et je n’avais pas repéré que dans le json « seg » il y avait une clé « n » pour le nom du segment.
En plus la doc de l’API JSON n’en parle pas c’est sans doute un ajout récent ?

Oui la reconnaissance des segments sur le wLed n’est pas forcément le mieux au vu de mon commentaire.

Par contre permettre à l’utilisateur de définir ses segments (voir des Scenes composées de plusieurs param de segments) dans le plug in qui seraient ensuite envoyé à wLed avec les instructions d’effets, ça pourrait être sympa…

En gros reproduire le principe des Presets mais paramétrable et stockées sur le plug-in ?
(Que j’appelle dans mon exemples des scenes) :

Et ensuite de pouvoir déclencher ces scenes en envoyant le jSon correspondant (Segments + params) au travers d’une vue objet dans le tableau de bord :

Voir pouvoir appeler les scènes dans des scenarios en sélectionnant comme valeur le nom de la scène…
(dans un menu déroulant) …

(Bon ma proposition est peut être un peu trop du sur mesure … :face_with_hand_over_mouth:… Mais il y a peut être des trucs à prendre ?)

C’est sympa ce device monté entre 2 plaques de verres … :slight_smile:

Mon bidule est monté sur un ESP32

Du coups quel est le format de tes requettes jSon?

Ne sont il pas formaté avec un préfix :

`curl -X POST « http://192.174.0.75/json/state » -d ’
et un sufix de type :

' -H "Content-Type: application/json"

Si ce n’est pas trop abusé, pourrais tu me donner un exemple de commande qui fonctionnerait selon toi que je puisse tester sur une requête jSon sur le plugin Script (comme ci dessus), que je puisse de mon coté avancer sur mon explo ? :pray:

En fait j’essaie de faire du code php réutilisable d’un plugin à l’autre :smiley: donc j’ai une fonction générique

public static function request($_ip,$_endpoint = '',$_payload = null,$_method='GET'){
        $url = 'http://' . $_ip . $_endpoint;
        if($_method=='GET') {
            if (is_array($_payload) && count($_payload) > 0){
                $url .= '&';
                foreach ($_payload as $key => $value) {
                    $url .= $key.'='.urlencode($value).'&';
                }
                $url = trim($url,'&');
            }
            $request_http = new com_http($url);
        } else {
            $request_http = new com_http($url);
            $request_http->setHeader(array(
              'Content-Type: application/json'
            ));
            if($_payload !== ""){
                if($_method == 'POST'){
                    $request_http->setPost($_payload);
                } elseif($_method == 'PUT') {
                    $request_http->setPut($_payload);
                }
            }
        }
        $result = $request_http->exec(60,1);
        return $result;
    }

Pour ce qui nous intéresse comme c’est un POST le code relevant est

$request_http = new com_http($url);
            $request_http->setHeader(array(
              'Content-Type: application/json'
            ));
            if($_payload !== ""){
                if($_method == 'POST'){
                    $request_http->setPost($_payload);
                } elseif($_method == 'PUT') {
                    $request_http->setPut($_payload);
                }
            }
        $result = $request_http->exec(60,1);

Et par exemple pour envoyer un ordre on à un segment je fais un truc comme

        $data = '{"seg":[{"id":' . $segment . ', "on":true}]}';
        $endPoint ='/json/state';
        $ipAddress = $eqLogic->getConfiguration('ip_address');
        $result = wled::request($ipAddress, $endPoint, $data, 'POST');

Donc si je regarde bien je ne vois pas ce que je fais de différent de ton appel à curl, j’ai bien le même header, la même url et un json similaire. Je sèche.
La classe com_http que j’utilise est définie dans core\com\http_com.php et bien sûr elle utilise curl si tu veux jeter un oeil.
Une idée comme çà : peux tu essayer un truc du type

curl -X POST "http://192.168.0.38/json/state" -d '{"seg":[{"id":1, "on":true}]}' -H "Content-Type: application/json"

Pour voir si çà allume le segment 1 ou pas ?

Tu es sûr qu’il faut mettre des "pour l’url ? j’ai un doute

Merci pour les exemples @vedrine.

Du coups sur la base de ton exemple j’ai essayé çà :

curl -X POST "http://192.168.0.38/json/state" -d '
{"seg":[{
"id":2,"col":[[255,0,255]]
}]}
' -H "Content-Type: application/json"

pour changer plutôt la « couleur » que le « on-off »
(Dans mon utilisation, je passe les leds que je veux éteindre en noir. je ne les éteins pas à proprement parler)

Mais le lancement de la commande depuis jDom ne semble pas fonctionner.

Ce qui est étrange c’est que le même jSon dans le preset wLed fonctionne lui :


=> Rien ne se passe quand je déclenche.


=> Ça, ça fonctionne.

Ce qui m’amène donc à penser que ce n’est pas le code jSon qui flanche, mais plutôt la commande de requête autour ou le paramétrage du plugin script …


Note j’ai testé avec ou sans " … meme résultat.
Mais il me semble avoir vu je ne sais plus où qu’il faut bien des "

Je continue donc mon explo en utilisant pour le moment les requêtes http qui appellent des preset paramètrés sur wLed … essayant de réduire au max le code jSon pour économiser de la mémoire.

Par exemple j’arrive à minimiser le jSon généré :

{"on":true,"bri":14,"transition":0,"mainseg":0,"seg":[

{"id":1,"start":18,"stop":20,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"n":"Ht Sl blk",
"col":[[0,0,0],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":0,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},

{"id":2,"start":20,"stop":22,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"n":"Ht Sl col","col":[[0,150,70],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":0,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},{"stop":0},

{"id":3,"start":22,"stop":23,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"n":"Ht Sl end","col":[[0,0,0],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":0,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},{"stop":0},

{"id":4,"start":14,"stop":16,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"n":"Ht Cu blk","col":[[0,0,0],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":0,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},

{"id":5,"start":16,"stop":18,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"n":"Ht Cu col","col":[[0,150,70],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":0,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},

{"id":6,"start":18,"stop":19,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"n":"Ht Cu end","col":[[0,0,0],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":0,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0}

]}

en

{"on":true,"seg":[
	{"id":1,"start":18,"stop":19,"grp":1,"n":"Ht Sl blk","col":[[0,0,0]]},
	{"id":2,"start":19,"stop":22,"grp":1,"n":"Ht Sl col","col":[[150,100,0]]},
	{"id":3,"start":22,"stop":23,"grp":1,"n":"Ht Sl end","col":[[0,0,0]]},
{"stop":0},
	{"id":4,"start":14,"stop":17,"grp":1,"n":"Ht Cu blk","col":[[0,0,0]]},
	{"id":5,"start":17,"stop":18,"grp":1,"n":"Ht Cu col","col":[[150,100,0]]},
	{"id":6,"start":18,"stop":19,"grp":1,"n":"Ht Cu end","col":[[0,0,0]]},
{"stop":0}
]}

Dans mes explo, je suis tombé sur des trucs qui pourrait t’intéresser.

Tout d’abord :

L’utilisation de la commande « i » m’a posé problème.

En effet dans mon cas d’usage, je veux pouvoir changer des segments sans toucher à d’autres segments déjà séttés.

mais si je fait {"seg":{"i":[0,8,"000000", 9,"00FF00", 12,"0000FF"]}} il me met tout ce qui n’est pas spécifié en noir - même mes segments déjà settés précédemment.


Ensuite j’ai des comportement difficile à maitriser.

dans {"on":true,"seg":[ {"id":1,"start":18,"stop":19,"grp":1,"n":"Ht Sl blk","col":[[0,0,0]]}, {"id":2,"start":19,"stop":22,"grp":1,"n":"Ht Sl col","col":[[150,100,0]]}, {"id":3,"start":22,"stop":23,"grp":1,"n":"Ht Sl end","col":[[0,0,0]]}, {"stop":0},

Il faut que je mette le {« stop »:0}, pour être sur de ne pas risquer d’effacer les reglages des segments pré-séttés qui suivent.

Et je dois parametrer une led (un segment) en plus pour afficher correctement mes quatre led cible ???
Dans mon exemple c’est :

	{"id":3,"start":22,"stop":23,"grp":1,"n":"Ht Sl end","col":[[0,0,0]]},

(Si je ne le fait pas j’ai souvent une des led ciblé qui ne prennent pas les couleurs attendus)

Et ce qui est étrange aussi, c’est que cette led, elle (ce segment) n’overwrite pas la couleur setté auparavant …


Quoi qu’il en soit, en parametrant mes jSon dans wLed comme ci dessous.
J’arrive à peut près à obtenir le comportement souhaité …


Attendu :

{"on":true,"seg":[
	{"id":1,"start":18,"stop":20,"grp":1,"n":"Ht Sl blk","col":[[0,0,0]]},
	{"id":2,"start":20,"stop":22,"grp":1,"n":"Ht Sl col","col":[[0,150,70]]},
	{"id":3,"start":22,"stop":23,"grp":1,"n":"Ht Sl end","col":[[0,0,0]]},
{"stop":0},
	{"id":4,"start":14,"stop":16,"grp":1,"n":"Ht Cu blk","col":[[0,0,0]]},
	{"id":5,"start":16,"stop":18,"grp":1,"n":"Ht Cu col","col":[[0,150,70]]},
	{"id":6,"start":18,"stop":19,"grp":1,"n":"Ht Cu end","col":[[0,0,0]]},
{"stop":0}
]}

(Ici j’ai mis les autre leds set précédemment qui ne doivent pas bouger en en rose)


Sans les {« stop »:0}


Sans les segments d’arret en plus :

{"on":true,"seg":[
	{"id":1,"start":18,"stop":20,"grp":1,"n":"Ht Sl blk","col":[[0,0,0]]},
	{"id":2,"start":20,"stop":22,"grp":1,"n":"Ht Sl col","col":[[0,150,70]]},
{"stop":0},
	{"id":4,"start":14,"stop":16,"grp":1,"n":"Ht Cu blk","col":[[0,0,0]]},
	{"id":5,"start":16,"stop":18,"grp":1,"n":"Ht Cu col","col":[[0,150,70]]},
{"stop":0}
]}

Etrange n’est-ce pas ?


Voila.
Si ces retours peuvent t’aider.

Bon … J’ai ajouter un 3eme presset de segments dans mon wLed.

Et j’ai des comportements toujours plus erratique …
J’abandonne mon explo pour le moment…

Je me décourage de ne pas parvenir à comprendre les règles obscures qui sont à l’oeuvre sur les jSon wLed …

J’achète ça tout fait en chine avec les plaques en acrylique pré-percées et la visserie

et

Mais pour le moment çà semble épuisé, il faudra attendre une nouvelle série.

1 « J'aime »