Ok donc je te propose la modification ci dessous de la fonction « applystate ». Elle va récupérer les info d’état et de brillance une fois que le segment concerné aura été isolé du json et maintenant on peut allumer et éteindre un segment seul depuis ton plugin:
public function applyState($result) {
log::add('wled', 'debug', 'applyState for '. print_r($result, true));
$numseg = $this->getConfiguration('segment', 0);
// A revoir utiliser segment "id"
$segment = $result['seg'][$numseg];
log::add('wled', 'debug', 'Traitement segment '. print_r($segment, true));
$info = $segment['on'];
if ($info==1) {
$this->checkAndUpdateCmd('state', 1);
} else {
$this->checkAndUpdateCmd('state', 0);
}
$info = $segment['bri'];
$this->checkAndUpdateCmd('brightness_state', $info);
$effectNumber = $segment['fx'];
$this->checkAndUpdateCmd('effect_state', $effectNumber);
$effectCmd = $this->getCmd(null, "effect");
if (is_object($effectCmd)) {
$elements = explode(';', $effectCmd->getConfiguration('listValue', ''));
foreach ($elements as $element) {
$coupleArray = explode('|', $element);
if ($effectNumber == $coupleArray[0]) {
$this->checkAndUpdateCmd('effect_name', $coupleArray[1]);
}
}
}
$paletteNumber = $segment['pal'];
$this->checkAndUpdateCmd('palette_state', $paletteNumber);
$paletteCmd = $this->getCmd(null, "palette");
if (is_object($paletteCmd)) {
$elements = explode(';', $paletteCmd->getConfiguration('listValue', ''));
foreach ($elements as $element) {
$coupleArray = explode('|', $element);
if ($paletteNumber == $coupleArray[0]) {
$this->checkAndUpdateCmd('palette_name', $coupleArray[1]);
}
}
}
$this->checkAndUpdateCmd('speed_state', $segment['sx']);
$this->checkAndUpdateCmd('intensity_state', $segment['ix']);
log::add('wled', 'debug', 'segment '. print_r($segment, true));
$mainColor = $segment['col'][0];
log::add('wled', 'debug', 'main color '. print_r($mainColor, true));
log::add('wled', 'debug', 'bg color '. print_r($bgColor, true));
log::add('wled', 'debug', 'third color '. print_r($thirdColor, true));
$value = '#' . sprintf('%02x', $mainColor[0]) . sprintf('%02x', $mainColor[1]) . sprintf('%02x', $mainColor[2]);
log::add('wled', 'debug', 'color value '. $value);
$this->checkAndUpdateCmd('color_state', $value);
$value = '#' . sprintf('%02x', $bgColor[0]) . sprintf('%02x', $bgColor[1]) . sprintf('%02x', $bgColor[2]);
log::add('wled', 'debug', 'color bg value '. $value);
$this->checkAndUpdateCmd('color_state_bg', $value);
$value = '#' . sprintf('%02x', $thirdColor[0]) . sprintf('%02x', $thirdColor[1]) . sprintf('%02x', $thirdColor[2]);
log::add('wled', 'debug', 'color third value '. $value);
$this->checkAndUpdateCmd('color_state_third', $value);
}
Par contre lorsque tu « joues » avec le segment 0 en gros ça fait « power on » et « power off » mais ça n’agit pas sur le segment lui même. Les réactions ne correspondent pas à ce que tu peux faire depuis l’interface web sur ce segment
Lorsque tu lances un on ou off sur le segment 0 tu envoies le payload:
Non GET request payload : {"on":false}
Alors que lorsque tu lances les mêmes action sur le segment 1 par exemple tu as:
Non GET request payload : {"seg":[{"id":1, "on":false}]}
Est ce que tu ne devrais pas avoir la même chose entre les 2 segments?
Lorsque j’applique la modification ci dessous à la fonction « execute » je retrouve le fonctionnement équivalent à celui de l’interface web. Si tu n’as qu’un seul segment => segment 0, un on ou un off joue sur toutes les leds. Si tu as plus d’un segment => segment 0 + segment 1 + segment 2 + …, un on ou un off sur le segment 0 ne fait rien (en fait sur l’interface web cela te propose ou t’enlève des effets qui ne sont pas possibles sur les autres segments => androïd, …) mais un on ou un off sur un des autres segments allume ou éteint les LED associées à ce segment.
La modif que je te propose:
public function execute($_options = array()) {
if ($this->getType() != 'action') {
return;
}
$eqLogic = $this->getEqLogic();
$segment = $eqLogic->getConfiguration('segment', 0);
$action= $this->getLogicalId();
log::add('wled', 'debug', 'execute action '. $action);
log::add('wled', 'debug', 'execute options '. print_r($_options, true));
if ($action == 'on') {
$data = '{"seg":[{"id":' . $segment . ', "on":true}]}';
} else if ($action == 'off') {
$data = '{"seg":[{"id":' . $segment . ', "on":false}]}';
} else if ($action == 'brightness') {
$data = '{"seg":[{"id":' . $segment . ', "bri":' . intval($_options['slider']) . '}]}';
} else if ($action == 'effect') {
$data = '{"seg":[{"id":' . $segment . ', "fx":' . intval($_options['select']) . '}]}';
} else if ($action == 'palette') {
$data = '{"seg":[{"id":' . $segment . ', "pal":' . intval($_options['select']) . '}]}';
} else if ($action == 'color') {
list($r, $g, $b) = str_split(str_replace('#', '', $_options['color']), 2);
$r= hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$data = '{"seg":[{"id":' . $segment . ', "col":[[' . $r . ',' . $g . ',' . $b . ']]}]}';
} else if ($action == 'color_bg') {
list($r, $g, $b) = str_split(str_replace('#', '', $_options['color']), 2);
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$data = '{"seg":[{"id":' . $segment . ', "col":[[],[' . $r . ',' . $g . ',' . $b . '],[]]}]}';
} else if ($action == 'color_third') {
list($r, $g, $b) = str_split(str_replace('#', '', $_options['color']), 2);
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$data = '{"seg":[{"id":' . $segment . ', "col":[[],[],[' . $r . ',' . $g . ',' . $b . '],[]]}]}';
} else if ($action == 'speed') {
$data = '{"seg":[{"id":' . $segment . ', "sx":' . intval($_options['slider']) . '}]}';
} else if ($action == 'intensity') {
$data = '{"seg":[{"id":' . $segment . ', "sx":' . intval($_options['slider']) . '}]}';
} else if ($action == 'preset') {
$data = '{"ps":' . $_options['message'] . '}';
} else if ($action == 'psave') {
$data = '{"psave":' . $_options['message'] . '}';
} else if ($action == 'effectbyname') {
$effectCmd = $eqLogic->getCmd(null, "effect");
if (is_object($effectCmd)) {
$listeffects = $effectCmd->getConfiguration('listValue', array());
$listeffects = explode(';', $listeffects);
foreach ($listeffects as $k => $option) {
$effect = explode('|', $option);
if ($effect[1] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "fx":' . intval($effect[0]) . '}]}';
}
}
}
} else if ($action == 'palettebyname') {
$paletteCmd = $eqLogic->getCmd(null, "palette");
if (is_object($paletteCmd)) {
$listpalettes = $paletteCmd->getConfiguration('listValue', array());
$listpalettes = explode(';', $listpalettes);
foreach ($listpalettes as $k => $option) {
$palette = explode('|', $option);
if ($palette[1] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "pal":' . intval($palette[0]) . '}]}';
}
}
}
} else if ($action == 'effectbynum') {
$effectCmd = $eqLogic->getCmd(null, "effect");
if (is_object($effectCmd)) {
$listeffects = $effectCmd->getConfiguration('listValue', array());
$listeffects = explode(';', $listeffects);
log::add('wled', 'debug', 'list effets '. print_r($listeffects, true));
foreach ($listeffects as $k => $option) {
$effect = explode('|', $option);
log::add('wled', 'debug', 'effet '. print_r($effect, true));
if ($effect[0] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "fx":' . intval($effect[0]) . '}]}';
}
}
}
} else if ($action == 'palettebynum') {
$paletteCmd = $eqLogic->getCmd(null, "palette");
if (is_object($paletteCmd)) {
$listpalettes = $paletteCmd->getConfiguration('listValue', array());
$listpalettes = explode(';', $listpalettes);
foreach ($listpalettes as $k => $option) {
$palette = explode('|', $option);
if ($palette[0] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "pal":' . intval($palette[0]) . '}]}';
}
}
}
}
log::add('wled', 'debug', 'execute data '. $data);
$endPoint ='/json/state';
$ipAddress = $eqLogic->getConfiguration('ip_address');
$result = wled::request($ipAddress, $endPoint, $data, 'POST', false);
log::add('wled', 'debug', 'execute request result '. $result);
$eqLogic->getWledStatus();
$eqLogic->refreshWidget();
}
Si tu souhaites conserver le fonctionnement actuel où lorsque tu « éteins » le segment 0 tu éteints toutes les LED alors tu peux appliquer plutôt cette modification:
public function execute($_options = array()) {
if ($this->getType() != 'action') {
return;
}
$eqLogic = $this->getEqLogic();
$segment = $eqLogic->getConfiguration('segment', 0);
$action= $this->getLogicalId();
log::add('wled', 'debug', 'execute action '. $action);
log::add('wled', 'debug', 'execute options '. print_r($_options, true));
if ($action == 'on') {
if ($segment == 0) {
$data = '{"on":true,"seg":[{"id":' . $segment . ', "on":true}]}';
} else {
$data = '{"seg":[{"id":' . $segment . ', "on":true}]}';
}
} else if ($action == 'off') {
if ($segment == 0) {
$data = '{"on":false,"seg":[{"id":' . $segment . ', "on":false}]}';
} else {
$data = '{"seg":[{"id":' . $segment . ', "on":false}]}';
}
} else if ($action == 'brightness') {
if ($segment == 0) {
$data = '{"bri":' . intval($_options['slider']) . ',"seg":[{"id":' . $segment . ', "bri":' . intval($_options['slider']) . '}]}';
} else {
$data = '{"seg":[{"id":' . $segment . ', "bri":' . intval($_options['slider']) . '}]}';
}
} else if ($action == 'effect') {
$data = '{"seg":[{"id":' . $segment . ', "fx":' . intval($_options['select']) . '}]}';
} else if ($action == 'palette') {
$data = '{"seg":[{"id":' . $segment . ', "pal":' . intval($_options['select']) . '}]}';
} else if ($action == 'color') {
list($r, $g, $b) = str_split(str_replace('#', '', $_options['color']), 2);
$r= hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$data = '{"seg":[{"id":' . $segment . ', "col":[[' . $r . ',' . $g . ',' . $b . ']]}]}';
} else if ($action == 'color_bg') {
list($r, $g, $b) = str_split(str_replace('#', '', $_options['color']), 2);
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$data = '{"seg":[{"id":' . $segment . ', "col":[[],[' . $r . ',' . $g . ',' . $b . '],[]]}]}';
} else if ($action == 'color_third') {
list($r, $g, $b) = str_split(str_replace('#', '', $_options['color']), 2);
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$data = '{"seg":[{"id":' . $segment . ', "col":[[],[],[' . $r . ',' . $g . ',' . $b . '],[]]}]}';
} else if ($action == 'speed') {
$data = '{"seg":[{"id":' . $segment . ', "sx":' . intval($_options['slider']) . '}]}';
} else if ($action == 'intensity') {
$data = '{"seg":[{"id":' . $segment . ', "sx":' . intval($_options['slider']) . '}]}';
} else if ($action == 'preset') {
$data = '{"ps":' . $_options['message'] . '}';
} else if ($action == 'psave') {
$data = '{"psave":' . $_options['message'] . '}';
} else if ($action == 'effectbyname') {
$effectCmd = $eqLogic->getCmd(null, "effect");
if (is_object($effectCmd)) {
$listeffects = $effectCmd->getConfiguration('listValue', array());
$listeffects = explode(';', $listeffects);
foreach ($listeffects as $k => $option) {
$effect = explode('|', $option);
if ($effect[1] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "fx":' . intval($effect[0]) . '}]}';
}
}
}
} else if ($action == 'palettebyname') {
$paletteCmd = $eqLogic->getCmd(null, "palette");
if (is_object($paletteCmd)) {
$listpalettes = $paletteCmd->getConfiguration('listValue', array());
$listpalettes = explode(';', $listpalettes);
foreach ($listpalettes as $k => $option) {
$palette = explode('|', $option);
if ($palette[1] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "pal":' . intval($palette[0]) . '}]}';
}
}
}
} else if ($action == 'effectbynum') {
$effectCmd = $eqLogic->getCmd(null, "effect");
if (is_object($effectCmd)) {
$listeffects = $effectCmd->getConfiguration('listValue', array());
$listeffects = explode(';', $listeffects);
log::add('wled', 'debug', 'list effets '. print_r($listeffects, true));
foreach ($listeffects as $k => $option) {
$effect = explode('|', $option);
log::add('wled', 'debug', 'effet '. print_r($effect, true));
if ($effect[0] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "fx":' . intval($effect[0]) . '}]}';
}
}
}
} else if ($action == 'palettebynum') {
$paletteCmd = $eqLogic->getCmd(null, "palette");
if (is_object($paletteCmd)) {
$listpalettes = $paletteCmd->getConfiguration('listValue', array());
$listpalettes = explode(';', $listpalettes);
foreach ($listpalettes as $k => $option) {
$palette = explode('|', $option);
if ($palette[0] == $_options['message']) {
$data = '{"seg":[{"id":' . $segment . ', "pal":' . intval($palette[0]) . '}]}';
}
}
}
}
log::add('wled', 'debug', 'execute data '. $data);
$endPoint ='/json/state';
$ipAddress = $eqLogic->getConfiguration('ip_address');
$result = wled::request($ipAddress, $endPoint, $data, 'POST', false);
log::add('wled', 'debug', 'execute request result '. $result);
$eqLogic->getWledStatus();
$eqLogic->refreshWidget();
}