Colour Mixing and Encoding

Hi Daniel,
I saw you mention about trying to figure out the Colour mixing,  RGB HSV etc,
Did you try CMY,  The theatrical industry is used to using Cyan Magenta Yellow from the Colourwheel mixing in Moving Heads, or Scrollers on static lights.
I was looking at the BT LE Pixmob project on github and wondered if the encoding might be simlar,  Looking at the DMX Channel Breakdown from the Onyx Lighting Console vs the BT LE Bands,   It kinda looks like PixMob would probably used the same incoding,  or at least very simlar!  e.g. Below.
Cheers,
Byte 0		Always EE
Byte 1		Flags field:
		Bit 1: Clap mode
		Bit 2: Multicolor mode, select random or sequential from a pool of colors.
		Bit 5: One-shot mode, ignore further identical commands.
Byte 2		Green component of color data (00 is off)
Byte 3		Red component of color data (00 is off)
Byte 4		Blue component of color data (00 is off)
Byte 5		Chance and attack
		Bit 0-2:  1: 85% -> 7: 5%
		Bit 3-5: attack:  0: instant-> 7: slowest
		Bit 6-7: ignored
Byte 6:		Sustain and release
		Bit 0-2: sustain
			0: none
			1-6: longer intervals
			7: until overridden by another command
		Bit 3-5: release, encoding identical to attack
		Bit 6-7: ignored
Byte 7		Group and unknown flag
		Bit 0-4: Group, 0x00 = all bracelets, 0x01-0x1f: bracelets in specified group
		Bit 5: unknown flag, related to random color in multicolor mode
		Bit 6-7: ignored

Hi Sean,
Thanks so much for your thoughtful message and the info.
I did not try CMY--I'll have to do that. I didn't know it was a common standard in the industry.
I also didn't consider how the BT LE bracelets might share a similar command structure to the IR ones. The bit/byte descriptors you provide do sound like they could be very relevant, though I think there'd have to be at least some differences because the count of the bits doesn't quite line up, and I believe I tried changing some single bits within the second, third, and forth bytes and produced no visible results rather than colors with slightly modified red, green, and blue components. I haven't looked super in depth at the encoding patterns recently though, sometime I should sit down and compare.
Right now I am travelling and don't have my bracelets or IR blaster, but I'll look at this more when I can.
Thanks again,
Dani

Thanks for your reply Dani,
I will post some update on here with some discovery's.
But judging by the DMX channels by Harman/Onyx and also the DMX software I
use Avolites future's profiles I seems the is multiple things going in.
First off there is 15  Main Colours
RED
ROSE
MAGENTA
PURPLE
BLUE
LIGHTBLUE
CYAN
AQUA
GREEN
LIME
YELLOW
AMBER
WHITE 12.5%
WHITE 25%
WHITE 50%
WHITE 100%
I've matched these with most of the ones in your code.
Then there is also 15 Background Colours aka What you called DIM_
DIM_RED
GREEN_DIM
DIM_BLUE
LAVENDER
ULTRAVIOLET
WHITISH !?
WHITISH !?
Some of these names are from the fixture definition from Avolites & Onyx
Which also include the RGB values so I can at least see on screen if they
look similar.
Few of these seem right, gotta get my IR and
The wristbands don't seem to have a Intensity Chsnnel for RGB,  Just the 15
Bright and 15 Dim. Nor do them have an overall Intensity(Dimmer).
They look like they just Fade In/out times and Blackout to handle dimming.
Which makes sense,  if you were to hammer them with DMX they batteries
would be dead in no time, So having preset Colours, Fades, Effects & the
ability to sent a hand full of small stacked commands makes sense.
But then this were it gets interesting,
There is more than just Colour Code and Tail Code.  You might have noticed
some thet seem to be longer.
You can send a command via DMX that can define 3 colours,  Colour 1, Colour
2 and Background Colour.
Using other commands,  The bands can be told to Strobe, Fade, Pulse etc
between the 2 colours and rest at  background  colour.
I think this all happens in the Main IR code with the colours.
The tail code(s), multiple will register Fade In, Fade Out and Effect
Sustain.
At the Fade out section the background colour can be defined also.
Then there is also Fx Fuctions  These could be the Weird Codes,  With
settings such as,
Set Color RGB
Set Layer Active
Set Layer Group
Set Random Scale RGB
Set Envelope Delay Out
Set Envelope Iteration
Set Signal Timeouts
Lots parameters can be set via these,  might explain the Weirdness.
The problem with there parameters that can be send it,  They are not
viable.  So you try to brute,  You don't see a response so have no idea
what has been chsnge if anything.
So for every command.you throw at them, you'd have to run though every
known command again to see if there was any change.
So I'm wondering,  I might be able to get the scope onto one of the pins
and see if i can find somewhere they react to Good or Bad commands.  Even
if it's a slightly change in voltage.
Anyways,  I am not really good with the coding and decoding,  but I know
DMX pretty well,  an lots about Pixels and Theatrical Lighting so Analysis
and experimention is key for me
That is a bit of read for your travels lol
Sorry I waffle on.  🙄
Thanks for all you've done,  I'm so happy with having these running as they
are,  can't wait find out when else is lurking inside that legged little
chip.
Enjoy the rest of your travel.
Sean
P.s. excuse any typos and bad grammar,  I've got bad eyes.
On Fri, 11 Nov 2022, 19:42 Dani Weidman, @.***> wrote:

Hi Sean,
Thanks so much for your thoughtful message and the info.
I did not try CMY--I'll have to do that. I didn't know it was a common
standard in the industry.
I also didn't consider how the BT LE bracelets might share a similar
command structure to the IR ones. The bit/byte descriptors you provide do
sound like they could be very relevant, though I think there'd have to be
at least some differences because the count of the bits doesn't quite line
up, and I believe I tried changing some single bits within the second,
third, and forth bytes and produced no visible results rather than colors
with slightly modified red, green, and blue components. I haven't looked
super in depth at the encoding patterns recently though, sometime I should
sit down and compare.
Right now I am travelling and don't have my bracelets or IR blaster, but
I'll look at this more when I can.
Thanks again,
Dani
—
Reply to this email directly, view it on GitHub
https://github.com/danielweidman/pixmob-ir-reverse-engineering/issues/8#issuecomment-1312131541,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABPB3C6JMB56LPWENGKAVZTWH2OTPANCNFSM6AAAAAAR5VKREA
.
You are receiving this because you authored the thread.Message ID:
@.***
com>

Interesting! Thanks for all the research you've put into this, it's awesome. I'm sorry I haven't had more time to mess around with this stuff recently. You seem to have a pretty good idea of coding and decoding from the sound of it, haha.
You have a really good point about us not knowing whether or not the codes from the brute force that don't produce a visible effect are "doing anything". I imagine you're correct, many are probably doing stuff behind the scenes like changing those parameters.
Did you ever try things out with the scope?

Interesting! Thanks for all the research you've put into this, it's awesome. I'm sorry I haven't had more time to mess around with this stuff recently. You seem to have a pretty good idea of coding and decoding from the sound of it, haha.
You have a really good point about us not knowing whether or not the codes from the brute force that don't produce a visible effect are "doing anything". I imagine you're correct, many are probably doing stuff behind the scenes like changing those parameters.
Did you ever try things out with the scope?

Hi Dani,
No I haven't tried scoping it yet.
But I might not be as correct on the colors, There is alot more colors than I expected.
I have been running your Brute Force Script for the past few weeks and I've extracted nearly all the Colour Codes out of the Wristbands.  Got a few more to do,   But so far I'm at around 900 codes.  I think the Full Color Pallet will be 1024 colors in total.  32 Hues  by 32 Shades.
My next is the issues of sorting the color codes into the correct orders of hue and shade.
Here is how I have started to do it so far.  I got a Color Sensor attached to another Arduino that outputs to the color via serial in RGB values 0-255. Then have the sensor strapped to the Wristband.  It works great.  So using the Brute Script every time it fines a code and I pause it and hit the Copy button a butch of times to get a stable reading. Then I've been copying the result from my terminal to the text file I am storing the codes from the brute adding the RGB values after each code in ##Comments.
I've done this method for the last 60 codes I've gotten,  but I'm stuck with all the 900 ones I've got out of the bands previously,  I don't want to sit for another couple of weeks re-bruting.

I could do with a script like the Brute Script that can read the txt file that is in the format outputted by the brute tool, and for each code,  will hold the Color On for say 5 seconds, and say after 2.5 seconds of the 5,  Read the second COM Port and get the RGB Value from the sensor, then amment the text file with the RGB Values again in the comments. Then once written resume to next code in the text file and so on.
Do you think you could help with this?
I dont think it would be all that hard to put as essentially it work work very similar to the Python Sender,  with bit extra to freeze on each color,  and read from 2nd serial device and output the text ammendment.
The idea of sorting all these codes is,  once sorted in correct color order the the pattern in the binary codes might start to make sense two what the IR values actully are.

Hi again,
Wow, that's really awesome that you've found 900 colors! So many more than the 85ish base colors I did (assuming they are all base colors--are they? Or do some fade in/out or do probabilistic things?).
To confirm, you've already got 900 codes in a text file, and you want a script that will go through each code, and:

Repeatedly send the code for 5 seconds (to hold it on)
2.5 seconds into sending the code, check a second COM port for some data
Write both the code that was transmitted and the data received from the second COM port into a second text file.

Is that right? If so, I should be able to help with it.
How are you reading the data from the color sensor right now? And what's the model of the color sensor? If it works by sending raw data into a COM port as you suggest then that's awesome. I would have expected something like that to require some arbitrary software to read the values and maybe not even show up as a COM port on Windows, but I've never owned a color sensor before.
One thing though regarding the color pallete size: I saw on the PixMob site the following:

With our palette of 16 million colours, our pixels can beat to the rhythm of a pop song, gently shimmer to classical music, pulsate like a heartbeat or light up your whole audience as one unifying the whole venue.
16 million colors would suggest 24-bit/3 byte colors like you mentioned in your first post.
Does your 1024 estimate number include things like different brightnesses or other variation? If there are many different brightnesses and variations on top of that then I guess that could reach 16 million (but there'd need to be a lot). Or, perhaps there are multiple types of packets with different lengths or something, and the ones we are investigating so far are "shorter" ones that don't have as many colors. Or perhaps they are being cheeky and counting multiple different effects like fade, etc as different "colors".

Never mind my question about how your color sensor works--I must have missed or misinterpreted what you wrote the first time (that it's a module connected to a second Arduino which outputs the values be serial). That's perfect.

I will come back to you in a while as I'm out at the moment,   but I will leave you with these pictures in the mean time.

assuming they are all base colors--are they? Or do some fade in/out or do probabilistic things?

I think I only came across 1 code that held for a longer duration,  all the codes founds where all the same length as far as I noticed anyway,  None seemed to be longer than a short Pulse.
With in all these codes,  when I say 900,  that includes all the different brightnesses

To confirm, you've already got 900 codes in a text file, and you want a script that will go through each code, and:

Repeatedly send the code for 5 seconds (to hold it on)
2.5 seconds into sending the code, check a second COM port for some data
Write both the code that was transmitted and the data received from the second COM port into a second text file.

Is that right? If so, I should be able to help with it.

Exactly Right,  Spot On...
I probably could be done on one microcontroller,   I use ESP32 for my IR Blaser with your ESP code,  (Well I use ESP32s for everything I love them),  But with the Colour Sensor i am using it refused to work with my ESP32s,  I spent hours messing around with it just giving me garbage text output over serial,  tried everything,  different pins,  baud rates etc but it wad a no go,  but I had a Arduino UNO laying about and it worked first time on that.
So 2 MCUs works fine,  So IR TX via COM3,  Colour RGB Value RX on COM4.
I know you vito'd then next bit below,  but here ia a bit more info on colour sensor.
The Model is GY-33 of the PCB,  But it is an standard TAOS TCS34725 sensor that all readily available for hobby or industrial use,  but this GY-33 PCB not only uses that package but comes with LED illumination, (I disabled that), But multiple different data pins for different connectivity UART TTL or I²C, but also I nice cowl/len mount part on the front which sits nicely around the LED sections on the wristbands.
It actully has it own MCU onboard for use via UART that will give average colour information but I've just got it set via jumper to I²C as it's the raw data output and it is apparently more accurate.
The sensor has a IR Filter which is great for this use since I am firing IR all over the place to trigger the bands,  plus eliminate wrong colours from the tiny amount or IR emmited from the LED Packages them selves,
It detects 4 different light values,  RED, GREEN, BLUE, CLEAR.
Clear being White/Mixed spectrum, I believe it uses the Clear Light sensor along side the RGB Sensors with some math to calculate Colour Temperature and LUX,
But as we are working with RGB LEDs, this Clear value isn't needed.
I am using an example sketch I found for this model online that allows me to disable the  illumination LEDs, then I have modified the code to take the 16bits value 0-65535 per colour channel to 8bits 0-255  per channel, 16bit would give just over 196 colour variants,  and that gives me a head ache thinking about.  So 8bit values gives a maximum of 65535 colours,  which is a nice value to work with as it works nicely with things like DMX 0-255 per channel, or SImple Hex codes #000000 to #FFFFFF.
Then I have removed  everything else from the serial output,  So it just outputs a clean RGB value, 0-255, Comma Seperated. That just outputs on a new line in a loop.
0, 0,0 > 255, 255, 255

How are you reading the data from the color sensor right now? And what's the model of the color sensor? If it works by sending raw data into a COM port as you suggest then that's awesome. I would have expected something like that to require some arbitrary software to read the values and maybe not even show up as a COM port on Windows, but I've never owned a color sensor before.

One thing though regarding the color pallete size: I saw on the PixMob site the following:

With our palette of 16 million colours, our pixels can beat to the rhythm of a pop song, gently shimmer to classical music, pulsate like a heartbeat or light up your whole audience as one unifying the whole venue.

If you look at the DMX channels layout they have for the Conteollers, there is only 3 color channels,  R, G, & B,  With DMX each channel can be adjusted between 0-255 so across the 3 RGB channels, 768 values, minus the Zeros as they are off (No Light) leaving 765 possible colours.
Now take my just shy of 900 codes,  I'm pretty sure there is going to be a few duplicates in there,  I bet it will come somewhere around that number of 765

16 million colors would suggest 24-bit/3 byte colors like you mentioned in your first post.

I am doubting 16.7million colours,  24bit  colour is a bit extreme,  RGB LEDs sre not exactly very good at representing 16bit colour specially at the price point these are probably at,  Looking at the LED Chips they are very generic looking SMD Packages   compared so some of RGB scripts I have rolls of,  they looks exactly the same,  Cheap Chinese RGB 5050 Packages,
Plus they are using DMX to control these,  DMX is 256 values per Channel, 512 Channels per Universe,
So 16.7Millions colours would end up as 128 DMX Universes thats of 65535 DMX Channels each with a value to 0-255.
For addressing colours to wrist bands this would be silly and not practical and a waste of bandwidth if attempted over Artnet or E1-31 (DMX-Over-Ethernet),  There is other protocols used for this kinda of colour resolution generally used for Large Matscies,  But your moving from the realm of Lighting into the world a Video then.
There is more factors that make me sway away from this idea,  think about the tidy 8 legged mcu in the writeband, Holding all the data for such high colour resolution,  plus the processing of it, and the shear amount of IR Codes needed I don't think would fit in that burts of data we are seeing them use and all operating on a couple of AA's.
So I call B.S. for know,  but who knows  once we have the colours in order from the sensor data  we could see a pattern that may unlock more,
There could be a simple bit shift that make it jump to different pallet Hues, maybe a bit like how most of the codes via IR start 101,  but there is also the 110 ones that seem to shift the rest of the bits to different places.
I don't know if you noticed that,
I wondered if this was a limitation of IR or maybe certain allocations,    With RF this allocated bandwidth is a thing, But I never through that was a thing with IR,  But thinking about it IR is used for so many thinks these days where allocation might also be a thing,  i.e.  Security Camera,  Iris Scanners, Finger Print Readers and Thermal Imaging.
Sorry going off on one there....

Does your 1024 estimate number include things like different brightnesses or other variation? If there are many different brightnesses and variations on top of that then I guess that could reach 16 million (but there'd need to be a lot).

1024 Guesstimate,  Well if there are alot of Duplicates I bet it will land around 756,   If there is more codes founds and little duplicates I would ain't for 1024,  But that would be all colours and brightnesses in total, excluding and variants, Specially Effects, Held Colours or Weirds.

Or, perhaps there are multiple types of packets with different lengths or something, and the ones we are investigating so far are "shorter" ones that don't have as many colors. Or perhaps they are being cheeky and counting multiple different effects like fade, etc as different "colors".

I would bet on the latter,  after I found between 600-700 codes they started to become less and less, and rather than coming in butches of 5, 6 or 8 codes within couple of codes from each other, they became much less,  2 or 3, or less within a few hundred codes of each other,  At first I was sitting  staring at the screen the 2 wristband and the codes came so rapidly I couldn't look away for second incase I missed one,  but after that 700ish mark,  I changed the batteries and pulled the (New DIY) Pins out on 8 other wristbands I replaced batteries in a few weeks ago!  And surrounded myself with them so no matter where I looked I couldn't not see a flash,   because sometimes I was sitting for 20>40mins with the brute flying by without a single flash.
I'll leave a screenshot teasers of the text file!
I will add everything to my film once I've tried up things a bit.

Hi Sean!
It's very interesting to read your analysis, and I'm so glad you have such a good understanding of DMX control because I don't. I also really love ESP32s.
One more thing to confirm about how the script RGB-reader needs to work: You say That just outputs on a new line in a loop.
How frequently does it output? just super quickly or is there some delay or trigger?
(by the way, it's probably easier for me to implement with it done on two microcontrollers anyway so I can just separately look at the two COM ports instead of filtering between data for one).
Regarding color counts, you, mention having three channels (R, G, B), each with 256 possible values (0-255, an 8 bit [2^8] number). By my math, that actually does come out to >16.7 million colors:
256*256*256 = 16777216 (minus 1 if you don't count 'off' as a color)
I think you have to do that instead of just:
256*3=768 (minus 1 if you don't count 'off' as a color)
Since it's every possible combination of the three values. As a math example, if there were just 4 possible values (1-4), I'd say that's 4*4*4 = 64 (or 63) colors. I've attached a screenshot of a spreadsheet with an example--there are 64 rows with RGB combinations and there are no repetitions. Does that make sense? Or did I misinterpret what you were saying to begin with?
Also:

There could be a simple bit shift that make it jump to different pallet Hues, maybe a bit like how most of the codes via IR start 101, but there is also the 110 ones that seem to shift the rest of the bits to different places.
That's an interesting though. I think I considered that briefly but never really looked too far into it. Part of me is scared that converting to binary in the way I did is potentially a huge red herring--I'm not sure how else it could be done though.

By the way, I have recently gotten some small, simple single-hard-PCB bracelets from an event (they didn't seem to be officially collecting them for recycling them and a few people had placed them in a random basket used by the security people for bag inspections; I asked the security people and they said I could have them). Would you like a few of those to test with? I can imagine two reasons that would be useful: 1) some codes I've found seem to either only work on the Coldplay bracelets, (or perhaps they only work on the group for the one Coldplay bracelet I own), and 2) the PCB is a lot simpler than the flexible ones on the Coldplay bracelets and might be easier to use with an oscilloscope.

Hi Dani,
First off,

Regarding color counts, you, mention having three channels (R, G, B), each with 256 possible values (0-255, an 8 bit [2^8] number).   Math's isn't my strong point anyways.  Your correct with the 256x256x256. Which means we're still short over 16.7millions colours,  It would be cool if we could find them,  But i think 32 Colours with 32 Brightness would be perfectly acceptable.
I'd be happy if i could get just enough for fulfill one of these colourwheels,

One more thing to confirm about how the script RGB-reader needs to work: You say That just outputs on a new line in a loop.
How frequently does it output? just super quickly or is there some delay or trigger?

Maybe this would be easier,    Here's the code i'm using,
`#include <Wire.h>
#include "Adafruit_TCS34725.h"
#define commonAnode true
// our RGB -> eye-recognized gamma color
byte gammatable[256];
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
void setup() {
Serial.begin(9600);
Serial.println("Pixel Colour Detect");
if (tcs.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1); // halt!
}
for (int i=0; i<256; i++) {
float x = i;
x /= 255;
x = pow(x, 2.5);
x *= 255;
if (commonAnode) {
  gammatable[i] = 255 - x;
} else {
  gammatable[i] = x;
}
//Serial.println(gammatable[i]);

}
}
void loop() {
uint16_t clear, red, green, blue;
tcs.setInterrupt(false);      // turn on LED
delay(100);  // takes 50ms to read
tcs.getRawData(&red, &green, &blue, &clear);
tcs.setInterrupt(true);  // turn off LED
// Figure out some basic hex code for visualization
uint32_t sum = clear;
float r, g, b;
r = red; r /= sum;
g = green; g /= sum;
b = blue; b /= sum;
r *= 256; g *= 256; b *= 256;
Serial.print((int)r, DEC);
Serial.print(",");
Serial.print((int)g, DEC);
Serial.print(",");
Serial.print((int)b, DEC);
Serial.println();
}
// Serial.print("\t\t");
//  Serial.print((int)r, HEX); Serial.print((int)g, HEX); Serial.print((int)b, HEX);
//Serial.print("\t");
//Serial.print(red);Serial.print(",");
//Serial.print(green);Serial.print(",");
//Serial.print(blue);Serial.print("\t\t\t");
// Serial.print(int(valueR, DEC)); Serial.print(","); Serial.print(int(valueG, DEC)); Serial.print(","); Serial.print(int(valueB, DEC));
//Serial.print((int)r ); Serial.print(" "); Serial.print((int)g);Serial.print(" ");  Serial.println((int)b );`

(by the way, it's probably easier for me to implement with it done on two microcontrollers anyway so I can just separately look at the two COM ports instead of filtering between data for one).

That's is great news,  You might want to change the Code above to suit the needs better.

By the way, I have recently gotten some small, simple single-hard-PCB bracelets from an event (they didn't seem to be officially collecting them for recycling them and a few people had placed them in a random basket used by the security people for bag inspections; I asked the security people and they said I could have them). Would you like a few of those to test with? If so I could mail them to you. I can imagine two reasons that would be useful: 1) some codes I've found seem to either only work on the Coldplay bracelets, (or perhaps they only work on the group for the one Coldplay bracelet I own), and 2) the PCB is a lot simpler than the flexible ones on the Coldplay bracelets and might be easier to use with an oscilloscope.

I would definitely be interested in them, If that would be okay mailing to the UK,   But before you do,  Are they anything like these?,

These were from a 2019 Spice Girls Concert,  They take small button 2x cell batterys (smaller that CR2032 maybe CR1620), I found a couple of batteries i had that fit,  Bit smaller so didn't last all that long,  But i had it sitting next to meet while running the brute and this version of wristband did seem to react to most of the commands,  well probably most,  I didnt notice it too much as the Coldplay ones over power it as it only have the 2 LED Packages,    I think the straight colours will work fine,  I think when it comes to the FX (Tail Codes, and Weirds) is where the older bands like this will have a different response,   Due to a older less refined,  or less advanced firmware on the MCU.  The only thing i noticed for sure was the colour rendition wasn't as accurate as the Coldplay ones, i.e. some colours where shifted more towards blue,  specially the white ones.  But this might be down to an older poor quality LED Package.
But if what you have it from a more recent event,  They i'd be interested.
Do you have a photo of the PCB,  If not,   Does it have a version Number or Name ?  What kind of Cells does it take ? and how many LED Packages does it have on the PCB ?

some codes I've found seem to either only work on the Coldplay bracelets, (or perhaps they only work on the group for the one Coldplay bracelet I own)

Somethings interesting about these Wristbands and the Group,   First i noticed you Post on,  ermmm, I think it was Hackaday,  Where the guy from Pixmob actully commented,
The comments where about Programming the wristbands for specific concerts or event,   and we have noticed how there is some differences in the colour output between Coldplay and The Weeknd.   I dont believe this is at all done by hard programming,  i.e. Directing programming the MCU via say Serial etc,   you would expect some Pads on the PCB for this,  But there doesnt seem to be,
Initial Thought was:  (Probably wrong,  I'll explain below)
Instead i think this is done by how I mention in a earlier comment,   Basicly using 'probably a handheld' programmer,   Then say there is 10 Groups of wristbands for different parts of an Arena,  They could have there bulk containers holding all the bands for Group ID01, Then simply 1 shot IR Program the container for specific group, out of IR sight of the other containers.
But this is why this isnt going to work.....The battery tab's would still be in...
Now how i believe they actually do it is;
Once the arena is full and people have had the Tabs pulled out,  Then the they production team simply use their IR Moving Head Fixture, Focus in on Each individual Area they want to make a group, then IR Zap the Area with the Programming for Group, including Colour Pallet to use for the Special Effect,  i.e. the Dual Colour Fade Effects,  Dual Color Strobe Effects, & Multi-Colour Randoms.  Note:  The only time so far were we have noticed a difference between the colours is the Dual Colour FX being different when its comes to Coldplay vs The Weeknd.
There Programming would be done by enabling the Programming DMX Channel 22 'Programming' Value 128>255 'Yes' then using the values within Channel 18. 'FX Ctrl'

We could run into issues if we came accross these codes by mistake
Using the moving heads would make a lot of sense as with modern moving head fixtures you can move to very accurate positions,  zoom to an exact area,  bring flats into the beam to shape it to the precise shape of the target area.  Then once the groups are programmed they can then just use the IR Wash fixtures to cover the whole arena and ones the groups who ID's are being sent will respond.
They use the moving heads in another interesting way at Coldplay,  and that is by using a GOBO (A Shaped Disk Silhouette) to shape the IR so that only Wristbands within its focus fire up and cause the shape be shown across the crowd,  In the case of Coldplay this was Red Shimmering Hearts.
But there is also the Video option,   I'm not sure exactly what this is,  It might be an alternative to the GOBO approach or might be what proves my last statement incorrect, Rather than using GOBO's,  The moving head needs a lot of power,   I have recently seen some modern LED moving heads inside,  The Light Source ('Light Engine' as they seems to call these EXTREMELY powerful LED arrays) they using is hundreds of tiny SMD LED's tightly jammed right up to each other on a heat sink,  The Martin Brand fixtures i saw inside of could using the array of LED's as a Matrix Display and project video,  Very low resolution mind,   I think it is something like 320x320,  But i don't see what PixMob couldn't do the exact same thing with  only IR rather than RGBUWW.  I would guess what they are using is like fixtures from a big brands that are modified to be IR.  I wish i could fine a Manual or Datasheets for the Movers like the one i have the the Wash Fixture.
Anyways,  I'm going off on one again!
I'll leave that with you,  Hopefully that code helps!

Hello Sean!
Sorry for the slow response (again).
I wrote two scripts to try and use with your color sensor. One does the thing where we repeatedly send one color command for a few seconds at a time and read from the color sensor simultaneously, and one just reads right after sending each color. The former will probably work better, but I also made the latter in case there's a bug or something and it happens to work okay without the repeated sending.
See: ir_code_discovery_and_export/send_and_read_color_detector_repeater.py
And: ir_code_discovery_and_export/send_and_read_color_detector.py

Which means we're still short over 16.7millions colours, It would be cool if we could find them, But i think 32 Colours with 32 Brightness would be perfectly acceptable.

32 colors and 32 shades would certainly be excellent. I'm surprised the Pixmob people even bothered to support so many more than that--but I guess it probably didn't add much complexity.

I would definitely be interested in them, If that would be okay mailing to the UK, But before you do, Are they anything like these?
Does it have a version Number or Name ? What kind of Cells does it take ? and how many LED Packages does it have on the PCB ?

The ones I brought up say "VIC v2.3r1" and are dated "20211206". Interestingly though, I also have a couple PALM v2.1 bracelets, with PCBs that look pretty similar to your Spice Girls PALM v1.7 one but not identical (and the date is a lot later). I'm attaching photos of both. Both have take 2 CR1632s and have 2 LED packages that are not quite as good at color rendition as the Coldplay ones, haha.

I would be happy to send some to the UK
I've been pretty surprised to find that most of the colors and tail codes (though not all) work on the smaller and older ones (pre-2018) as well. There are some interesting codes that only work on the older ones (motion sensitive ones which of course need the hardware the newer ones are missing but also some codes that seem to be able to be used for flashing between different colors at variable rates through repetition of the same code).

Initial Thought was: (Probably wrong, I'll explain below)
Instead i think this is done by how I mention in a earlier comment, Basicly using 'probably a handheld' programmer, Then say there is 10 Groups of wristbands for different parts of an Arena, They could have there bulk containers holding all the bands for Group ID01, Then simply 1 shot IR Program the container for specific group, out of IR sight of the other containers.
But this is why this isnt going to work.....The battery tab's would still be in...
Now how i believe they actually do it is;
Once the arena is full and people have had the Tabs pulled out, Then the they production team simply use their IR Moving Head Fixture, Focus in on Each individual Area they want to make a group, then IR Zap the Area with the Programming for Group, including Colour Pallet to use for the Special Effect, i.e. the Dual Colour Fade Effects, Dual Color Strobe Effects, & Multi-Colour Randoms. Note: The only time so far were we have noticed a difference between the colours is the Dual Colour FX being different when its comes to Coldplay vs The Weeknd.

I feel like if I were designing it and just needed positional grouping, that's exactly what I'd do (the moving head thing). (as an aside, I'm disappointed that it seemed like they didn't use any positional-dependent effects at all for the Weeknd concert or Cavs game I went to recently).
One thing relevant (and perhaps slightly contradictory?) to what you mentioned about sending commands for groups of bracelets in different containers may be this job listing I found a while ago. It lists as one of the job responsibilities:
* Flashing, “grouping” and pre-”grouping” of our wearables
Also, I've been surprised to find that at the last couple events I got bracelets at (the only ones I have a clear memory of), the pull tab was pulled by the time I got the bracelet. It looked like all the ones in the the boxes the people were handing them out from already had the tabs pulled/maybe never had tabs in the first place? Not sure how that would work exactly. I guess there could be some super deep sleep mode that would enable them to last for a few months/years only sampling IR very infrequently? Seems too good to be true though. I can't imagine how tedious it would be for the staff to go through every bracelet and thousands of tabs before each event but I guess it's possible (and maybe part of the above-linked job). They could definitely last at least a few days with the tab pulled and still work for a whole show.
At the events you've been to, were the bracelets distributed at the venue door, the section entry door, or left at the seats? I've only ever gotten them at the venue entry door--of course that would preclude any preprogrammed positional grouping since you can't know where guests will sit.

But there is also the Video option, I'm not sure exactly what this is, It might be an alternative to the GOBO approach or might be what proves my last statement incorrect, Rather than using GOBO's, The moving head needs a lot of power, I have recently seen some modern LED moving heads inside, The Light Source ('Light Engine' as they seems to call these EXTREMELY powerful LED arrays) they using is hundreds of tiny SMD LED's tightly jammed right up to each other on a heat sink, The Martin Brand fixtures i saw inside of could using the array of LED's as a Matrix Display and project video, Very low resolution mind, I think it is something like 320x320, But i don't see what PixMob couldn't do the exact same thing with only IR rather than RGBUWW. I would guess what they are using is like fixtures from a big brands that are modified to be IR. I wish i could fine a Manual or Datasheets for the Movers like the one i have the the Wash Fixture.

Interesting! My theory on that was that they could have a bright IR light source that blinks out the relevant commands, and then they put a high-contrast LCD in front of it (so the IR light source takes that place of a "backlight"). I think that's how an LCD projector works--just with a constant-on white visible light "bulb" for the light source instead of a blinking set of IR leds. Now that I think about it, there's no reason it could work like a DLP projector either--with the same light source difference and no color wheel. Does that make sense?

Hi Mate,
Dont worry about fast replies,
Cheers for the scripts,  I will give thema try tomorow moring and let you know how i get on,

I'm surprised the Pixmob people even bothered to support so many more than that--but I guess it probably didn't add much complexity.

I am sure it will be for the reason of Standards,   They can be used for many use's not just concerts, But during concerts the is normally Camera,  Video  for live use or recordings at then i comes to video coloir accuracy is very important,  But with it being 255x255x255 channels i would guess its normal practice as with any other light mixing via DMX.

I would be happy to send some to the UK

Definety interested,
I would love to fine out what General 8 Pin Microcontroller is,  I bet not a lot has changes, The PCB's are so simlar not alot changed, Extrta couple resistors but thats about it.

I've been pretty surprised to find that most of the colors and tail codes (though not all) work on the smaller and older ones (pre-2018) as well. There are some interesting codes that only work on the older ones

Yes these 2 Spice Girls ones dont react to some of the tail codes too. Im suprised i didnt come access more tail codes during brue but then again,  They might no do anything as mentioned previously.
I am sure the motion activated ones will be the same software,  same chip, well pretty much same design but with a pads for the viberation switch can to solder down to,   I was thinking it could access 2of the 3 pins replacing the IR which a change in firmware,  But remembered they exist with IR and Motion.
Woud love to know what pins on the MCU it would use,  Having a switch could unlock hidden possibilities.

I'm disappointed that it seemed like they didn't use any positional-dependent effects at all for the Weeknd concert or Cavs game I went to recently).

I think Coldplay are probably there biggest or maybe favorite client,  Coldplay like to go All Out when it comes to Lighting, Pyro and Visuals and PixMob probably wouldn't exist it it wasnt for the coldplays Xylo-Band's.

One thing relevant (and perhaps slightly contradictory?) to what you mentioned about sending commands for groups of bracelets in different containers may be this job listing

Well,  Yes programming them would have to be via IR as there is no other input,  No Pins or Pads,  But i let you the grouping is probably be 1% of that job, And the other 99% will be popping the bands open with a jjg then flipping Coil Cells or AAs,
$17pa for replacing thousands of batteries,  errrm  I'll pass!
I dont think they will do much Grouping like this as much these days as the moving head makes this much eaiser.

At the events you've been to, were the bracelets distributed at the venue door, the section entry door, or left at the seats?

Both Coldplay Gigs i went to this year the were giving them out at the enerance after security,  but also outside on the street/approach to arena,  The ones from big semi-white plastic bins (Looked like a small IBC Container) where give out inside at the entrance and the Tabs where pulled,  The ones give out at the street where pulled from big while plastic sacks at the tabs where felt in,  At whembly they people handing them out from the plastic container was pulling the tabs as passing them too you!
But in all cases adove,  I took well more than i was ment to,  but sneakiler weaving!  Plug being visually impaired and being guided in a special enterance give me an extra opertunity to get more,   After the Glasgow Coldplay get I left the venue with 9 of them.
Pulsing my IR Remote blaster i had at the big containers when leaving was VERY AMUSING for me!  But pretty confusing for the door staff collection the from people.
Another not from the last coldplay gig,  That peskie IR gets everywhere,  I went the toilet and there was at least 3 walls between me and the arena event space and the bloody thing was still working happily,  it wasnt until i covering it with my huddie it stopped.
But yes,  I got a few Tabbed ones,  and no different in operation.

I've only ever gotten them at the venue entry door
Ive also being buying them from eBay and Facebook Marketplace when price is a fiver or less, and a few of these where tabbed still.

Interesting! My theory on that was that they could have a bright IR light source that blinks out the relevant commands,

LCD wouldnt work,   Its cant contrast enough to block that kind of light intensity,  TBH its cant hardly work well enough on monitors.   This has been tried in the Lighting Industy,  A couple of companies tried to make moving heads thats where just essentially an LCD Projectior but with just I mush larger HMI Lamp.  They where having to use 1200watt HMI lamps the get the equivalent of a 250watt HMI Standard Gobo Fixture.
DLP could possibly be a OK solution,   but it does have terrible goasting and dift issues,   I am watching DLP right now and i luckily dont see that colour shifting or rainbow still people get from it,  but my phone as see it fine,   But that drifting might well mess with the IR signal if used for GFX or Video with an IR Code.
Where modern LED Light engines are already a dence Matrix of LED that are individually controllable for Framing, Digital Gobos, Video,  but also for Longevity and evergy saving.
Excuse any typos, gramma or non-sence,  ive been away over 24 hours!

Hi Mate,

I wrote two scripts to try and use with your color sensor. One does the thing where we repeatedly send one color command for a few seconds at a time and read from the color sensor simultaneously, and one just reads right after sending each color. The former will probably work better, but I also made the latter in case there's a bug or something and it happens to work okay without the repeated sending.

I've got "Im not a coder error"  (Probably something obvious)
`Traceback (most recent call last):
File ".\send_and_read_color_detector.py", line 67, in <module>
color_detecter_res = read_recent_color_detector_line()

File ".\send_and_read_color_detector.py", line 37, in read_recent_color_detector_line
if color_read_line.count(",")  < 2:

TypeError: argument should be integer or bytes-like object, not 'str'

It flashing LED's first colour in my list,  then drops out with this error,  same with the other script.
Its problably something simlar!
Cheers
Sean

Hey there! I want to respond about your other comments (and send you an email), but real quick about the script:
Try commenting out/removing lines 38-40 in the non-repeater version and lines 39-41 in the repeater version and let me know what happens! Those lines are probably not necessary.

Hey there! I want to respond about your other comments (and send you an email) later, but real quick about the script:
Try commenting out/removing lines 38-40 in the non-repeater version and lines 39-41 in the repeater version and let me know what happens! Those lines are probably not necessary.
Also, I assume you set the COM ports for the two Arduinos in the code, but just a reminder if you didn't.

Okay, This works but the output is wrong, But i think i know why!
Here is the output from the 2 text files,   1st is from normal script,  2nd from repeater.
`
"RED":	[1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b',0\r\n'
"GREEN":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'\n'
"BLUE":	[1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"CYAN":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"MAGENTA":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"YELLOW":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1] //b''
`
`
"RED":	[1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"GREEN":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"BLUE":	[1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"CYAN":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"MAGENTA":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"YELLOW":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1] //b'Pixel Colour Detect\r\n'
`
Here is what is happening,
"Pixel Colour Detect" is coming from my aurdino with the sensor, I noticed it in the code from that sketch.
For some reason why i Monitor the serial output it must cause must cause it to restart, so it prints
`Pixel Colour Detect
Found sensor 0`
I will remove these from that sketch so it doesnt print them,  I dont know why it restarts when new session connects though.

Hey there! I want to respond about your other comments (and send you an email) later, but real quick about the script:
Try commenting out/removing lines 38-40 in the non-repeater version and lines 39-41 in the repeater version and let me know what happens! Those lines are probably not necessary.
Also, I assume you set the COM ports for the two Arduinos in the code, but just a reminder if you didn't.

Okay, This works but the output is wrong, But i think i know why!
Here is the output from the 2 text files, 1st is from normal script, 2nd from repeater.
` "RED": [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b',0\r\n'
"GREEN": [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'\n'
"BLUE": [1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"CYAN": [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"MAGENTA": [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"YELLOW": [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1] //b'' `
` "RED": [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"GREEN": [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"BLUE": [1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"CYAN": [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"MAGENTA": [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b'Pixel Colour Detect\r\n'
"YELLOW": [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1] //b'Pixel Colour Detect\r\n' `
Here is what is happening,
"Pixel Colour Detect" is coming from my aurdino with the sensor, I noticed it in the code from that sketch.
For some reason why i Monitor the serial output it must cause must cause it to restart, so it prints
`Pixel Colour Detect
Found sensor 0`
I will remove these from that sketch so it doesnt print them, I dont know why it restarts when new session connects though.

Interesting, okay. I hope that works.
If it doesn't, the script could be re-written to open the serial connection once and keep it open. That would probably be better.
It looks like it's reading as bytes instead of a string, so adding a .decode() or after .readline() (so it would be ser.readline().decode()) would be good--it should get rid of the bs but not have anything to do with the main problem.
This is sad because I feel like it would be fast to interate in-person/if we both had the same hardware, but alas...

Okay Partial Success,
send_and_read_color_detector still Outputs,
"RED":	[1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b',0\r\n'
"GREEN":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'\n'
"BLUE":	[1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"CYAN":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"MAGENTA":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b''
"YELLOW":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1] //b''
I've added the blank lines so it formats better on here,
But yes,  With the fast script,  Serial port would need to be opened, then some time given,  then start reading,  While all the codes are sent,  then finally closed.
But with the reapeater script,   It just needs some tidying up,  Maybe on the way i am outputting from my Arduino,
But is the output from Repeater,
"RED":	[1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'251,32,37\r\n'
"GREEN":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //b'117,249,132\r\n'
"BLUE":	[1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //b'13,114,252\r\n'
"CYAN":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b'155,251,219\r\n'
"MAGENTA":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //b'253,109,153\r\n'
Maybe the way i am printing could be improved,
`Serial.print((int)r, DEC);
Serial.print(",");
Serial.print((int)g, DEC);
Serial.print(",");
Serial.print((int)b, DEC);
Serial.println();`

Oh okay! Did you add the decode() part? I would expect that to do most of the the cleaning up.
If you send the whole script as you are running it now I could add it and send it back.

Oh okay! Did you add the decode() part? I would expect that to do most of the the cleaning up.
If you send the whole script as you are running it now I could add it and send it back.

Sorry,  I think i missed the bit where you mention the decode while i was debugging.
Here is the complete code
`#include <Wire.h>
#include "Adafruit_TCS34725.h"
#define commonAnode true
// our RGB -> eye-recognized gamma color
byte gammatable[256];
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
void setup() {
Serial.begin(9600);
for (int i=0; i<256; i++) {
float x = i;
x /= 255;
x = pow(x, 2.5);
x *= 255;
if (commonAnode) {
gammatable[i] = 255 - x;
} else {
gammatable[i] = x;
}
}
}
void loop() {
uint16_t clear, red, green, blue;
tcs.setInterrupt(false); // turn on LED
delay(50); // takes 50ms to read
tcs.getRawData(&red, &green, &blue, &clear);
tcs.setInterrupt(true); // turn off LED
// Figure out some basic hex code for visualization
uint32_t sum = clear;
float r, g, b;
r = red; r /= sum;
g = green; g /= sum;
b = blue; b /= sum;
r *= 256; g *= 256; b *= 256;
Serial.print((int)r, DEC);
Serial.print(",");
Serial.print((int)g, DEC);
Serial.print(",");
Serial.print((int)b, DEC);
Serial.println();
}`

Oh okay! Regarding the .decode(), I was actually suggesting adding that in my scripts

.readline().decode()

I did that,  Now the Output has gone!
"RED":	[1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //
"GREEN":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1], //
"BLUE":	[1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1], //
"CYAN":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //
"MAGENTA":	[1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], //
"YELLOW":	[1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1] //

Pfft, darn! Haha, I guess it's better without that then.
If you just run the script and get everything with RGB values added, we should be able to just find/replace to remove the extra characters, right?

Yes,  Find and replace would work,  but I think the stuff at the end is
related to my poor way of formatting the RGB values.
/n being a quite common command for new line,  I'm sure it's to do with the
way I've broken to RGB value pint up,  pretty sure if that way consolidated
some way it would be okay,  not 100% but could be the issue.
On Fri, 23 Dec 2022, 21:27 Dani Weidman, @.***> wrote:

Pfft, darn! Haha, I guess it's better without that then.
If you just run the script and get everything with RGB values added, we
should be able to just find/replace to remove the extra characters, right?
—
Reply to this email directly, view it on GitHub
https://github.com/danielweidman/pixmob-ir-reverse-engineering/issues/8#issuecomment-1364344974,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABPB3C5E4ZMWXQUKNVUEEXTWOYKKHANCNFSM6AAAAAAR5VKREA
.
You are receiving this because you authored the thread.Message ID:
@.***
com>

Hello again!
The reason I was saying it's an issue in my code is because b' in python indicates the beginning of a string representation of a bytes-type object. I think it's actually a combination of that and just the fact that the serial package doesn't convert the received newline characters \r\n to actual newlines. I updated the code now--want to try again?

Hi,
I'm really interested in what @sean1983 is doing. Finding over 900 codes is amazing. Don't think I can make a mobile remote with that many... Maybe if I group the colours together with all the effects, would be very time-consuming unless someone makes a script. I can't code either, which is a shame.
Interested in the wristbands @sean1983 got. I got some from the O2 from the Jingle Bell Ball concert and I think ours might be similar.
When both of you are able to get a working script to get codes, I can attempt a demo remote<EMAIL_ADDRESS>if you can.

I think Coldplay are probably one of their biggest or maybe favourite clients, Coldplay likes to go All Out when it comes to Lighting, Pyro and Visuals and PixMob probably wouldn't exist if it wasn't for the Coldplay's Xylo-Band's.

Capital like to do it as well, and gave out X4 wristbands which use AAA and are super bright. They did it at the O2.

With the latest ones Coldplay use, they are really simple to open and replace the batteries. I use 2 blue plastic Pry Tools from an iFixit Kit in the little stots down each side, then press and all 4 clips open perfectly, then pop in New AAA's.

My one opened like that, I opened one clip at a time to make sure I didn't break them. Got a small scratch in the plastic but I think it will be fine.

Cheers

Hello again!
The reason I was saying it's an issue in my code is because b' in python indicates the beginning of a string representation of a bytes-type object. I think it's actually a combination of that and just the fact that the serial package doesn't convert the received newline characters \r\n to actual newlines. I updated the code now--want to try again?

Hi Dani,
So..  No luck with the single shot script,  it just outputs blank results,
But.  The Repeater Script works Perfectly,

Yes the repeater script is slower,  But does seem to capture accurate result,  So I am happy with this,  It has frozen a couple of time,   But if i ^C and re-run it runs okay!
So i will start and run my new codes through it in batches incase of crash,  I am probably going to hook up wristband to one of my bench PSU's so that there is no deviation as batteries drain.
I have previously made an excel sheet that will show all the colours for each line using the RGB Value,  and also converts it in the CMYK & HSL/V values too for easy sorting.
I'll let you know how i get along.

Hi,
I'm really interested in what @sean1983 is doing. Finding over 900 codes is amazing. Don't think I can make a mobile remote with that many... Maybe if I group the colours together with all the effects, would be very time-consuming unless someone makes a script. I can't code either, which is a shame.
Interested in the wristbands @sean1983 got. I got some from the O2 from the Jingle Bell Ball concert and I think ours might be similar.
When both of you are able to get a working script to get codes, I can attempt a demo remote<EMAIL_ADDRESS>if you can.

I think Coldplay are probably one of their biggest or maybe favourite clients, Coldplay likes to go All Out when it comes to Lighting, Pyro and Visuals and PixMob probably wouldn't exist if it wasn't for the Coldplay's Xylo-Band's.

Capital like to do it as well, and gave out X4 wristbands which use AAA and are super bright. They did it at the O2.

With the latest ones Coldplay use, they are really simple to open and replace the batteries. I use 2 blue plastic Pry Tools from an iFixit Kit in the little stots down each side, then press and all 4 clips open perfectly, then pop in New AAA's.

My one opened like that, I opened one clip at a time to make sure I didn't break them. Got a small scratch in the plastic but I think it will be fine.
Cheers

Hi @NTLS09
The idea at the moment is to use my colour sensor to convert the codes i've found to RGB values,   once this has been done the colours can be sorted by the values and we might be able to a pattern in the IR Code that relates to the colour output, brightness/shades for each colour.
If a pattern is discovered we wont need the 900 codes,  just a few codes that we can manipulate to adjust possible 65535 colours these wristbands may contain.
The Capital FM Event bands look like the same as the latest coldplay ones,  minus the extra leds that are in the straps.

I'm really glad to hear that the repeater script has worked! Sorry I have been busy and not active here. Good results?

@sean1983 Hope you are doing well
In case you didn't see, @tnikitin just came across a new 2022 RF-based bracelet! https://github.com/danielweidman/pixmob-ir-reverse-engineering/issues/14#issuecomment-1410576543
Thought you might be interested.

do anyone have code in side pixmob MCU ?


Definitions are not recognized if bracketed by HTML comments

If I have a Markdown file which includes definitions as such

[foo]: https://foo.bar
[baz]: https://baz.bop

I receive lint warnings of the kind
4:11-4:60    warning  Found reference to undefined definition  no-undefined-references
15:10-15:59  warning  Found reference to undefined definition  no-undefined-references

despite these references being defined.  Any particular reason why these definitions are not being recognized?

Thanks @kgryte, the reason for that is the way remark parses HTML: this “looks” like one HTML  block.
For example, see the demo, click “Show settings”, and try different parse settings.
In fact, to my knowledge, only GitHub (RedCarpet) allows those definitions. But, I now found out that CommonMark also switched it’s behaviour, so I’ll add support for this in remark too.
Thanks!

@wooorm Thanks for the response and demo link.

@wooorm To follow-up, the way remark parses HTML leads to a more general bug. For instance,
beep
===
[![NPM version][npm-image]][npm-url] [![Build Status][build-image]][build-url] [![Coverage Status][coverage-image]][coverage-url] [![Dependencies][dependencies-image]][dependencies-url]

> [Beep][beep] boop.

Beep boop is defined as

## Installation

`` bash
$ npm install beep-boop
``

gets parsed into
{
  "type": "root",
  "children": [
    {
      "type": "heading",
      "depth": 1,
      "children": [
        {
          "type": "text",
          "value": "beep",
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 5,
              "offset": 4
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 4,
          "offset": 8
        },
        "indent": [
          1
        ]
      }
    },
    {
      "type": "blockquote",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Beep",
              "position": {
                "start": {
                  "line": 5,
                  "column": 4,
                  "offset": 199
                },
                "end": {
                  "line": 5,
                  "column": 8,
                  "offset": 203
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " boop.",
              "position": {
                "start": {
                  "line": 5,
                  "column": 15,
                  "offset": 210
                },
                "end": {
                  "line": 5,
                  "column": 21,
                  "offset": 216
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 5,
              "column": 3,
              "offset": 198
            },
            "end": {
              "line": 5,
              "column": 21,
              "offset": 216
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 5,
          "column": 1,
          "offset": 196
        },
        "end": {
          "line": 5,
          "column": 21,
          "offset": 216
        },
        "indent": []
      }
    },
    {
      "type": "html",
      "value": "\nBeep boop is defined as",
      "position": {
        "start": {
          "line": 7,
          "column": 1,
          "offset": 218
        },
        "end": {
          "line": 8,
          "column": 24,
          "offset": 258
        },
        "indent": [
          1
        ]
      }
    },
    {
      "type": "html",
      "value": "\n
\n    \n
\n
",
      "position": {
        "start": {
          "line": 10,
          "column": 1,
          "offset": 260
        },
        "end": {
          "line": 14,
          "column": 7,
          "offset": 493
        },
        "indent": [
          1,
          1,
          1,
          1
        ]
      }
    },
    {
      "type": "html",
      "value": "\n",
      "position": {
        "start": {
          "line": 16,
          "column": 1,
          "offset": 495
        },
        "end": {
          "line": 17,
          "column": 18,
          "offset": 533
        },
        "indent": [
          1
        ]
      }
    },
    {
      "type": "html",
      "value": "\n## Installation",
      "position": {
        "start": {
          "line": 19,
          "column": 1,
          "offset": 535
        },
        "end": {
          "line": 20,
          "column": 16,
          "offset": 574
        },
        "indent": [
          1
        ]
      }
    },
    {
      "type": "code",
      "lang": "bash",
      "value": "$ npm install beep-boop",
      "position": {
        "start": {
          "line": 22,
          "column": 1,
          "offset": 576
        },
        "end": {
          "line": 24,
          "column": 4,
          "offset": 612
        },
        "indent": [
          1,
          1
        ]
      }
    },
    {
      "type": "html",
      "value": "",
      "position": {
        "start": {
          "line": 26,
          "column": 1,
          "offset": 614
        },
        "end": {
          "line": 26,
          "column": 25,
          "offset": 638
        },
        "indent": []
      }
    }
}

If the HTML comments immediately precede another entity, they are "grouped" with that entity.

Although, perhaps a bit confusingly, HTML comments seem to have a different behavior than other block HTML elements, as shown in example 126.

@kgryte Yeah, that’s what changed recently. It used to be that all block-level HTML needed blank lines in CommonMark!

@wooorm Yeah. Also coded up this gist, showing how commonmark seems to treat HTML nodes differently than remark.

This has been fixed now btw, I’m not sure when, sorry for leaving this issue open!


Confusing and mismatched terms

The title on the left nav bar of this page is "Set up GitHub SourceLinking" but the title at the top of the page itself is "Use Index Sources & Publish Symbols task to publish your symbols".
Next, there is no clear distinction between SourceLinking and Symbol Server. Are those the same thing? Is SourceLinking the cloud based version of Symbol Server? What is the difference between them? Also, under the "Set up Visual Studio" section, step 4 says to check "Enable Source Link support". What about "Enable source server support" which is shows as already checked? Is that needed too? Why are there both options now?
Finally, under "Using Source Link in .NET projects" it gives snippets for projects hosted on GitHub and projects hosted on Azure Repos. What about Azure DevOps Server? Should the snippet for Azure Repos be used or should no snippet be used? This is not clear at all.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 454a2728-fe4c-5570-6c72-f8e4a615a77d
Version Independent ID: 4c7cc7f3-9f97-8994-f370-1371931d28ec
Content: Publish symbols to Azure Artifacts symbol server - Azure Artifacts
Content Source: docs/artifacts/symbols/setting-up-github-sourcelinking.md
Product: devops
Technology: devops-artifacts
GitHub Login: @ramiMSFT
Microsoft Alias: rabououn

@bartsipes Thank you for your feedback. Source link is a set of packages to help with source debugging. Symbol servers are available with Azure Artifacts and are accessible by any user with access to the organization.
Check Enable source server support to enable support for Windows PDB files on symbol servers, and check Enable Source Link support to enable support for portable PDB files. I added a section to set up Azure DevOps server projects.


Use redux-form?

Any thoughts on using redux-form for this project?
example of phone number normalization:
http://erikras.github.io/redux-form/#/examples/normalizing

I don't even get why is redux used for a form field.

@patw0929 can you close this?


Remove defunct demo

I have spent ~4 hours working through the demo trying to get it working. It has problems so severe that I don’t think it’s worth trying to salvage it. This example might make a good blog entry for people who are thoroughly versed in Kaldi, an Open Source automatic speech recognition (ASR) project, and who are interested in an MXNet wrapper for it but does not stand alone as an introductory example to speech recognition suitable for inclusion in the MXNet repo. Alternatively, an ASR expert could perhaps rework this example and resubmit it if it illustrated general MXNet concepts.
Specific criticisms that lead me to propose removing the demo altogether:

Depends on Kaldi which is a bear to install and compile (but I got there in the end).
The example includes a Python wrapper around Kaldi which does not compile. Editing the makefile to remove the link dependency on ../thread/kaldi-thread.a allowed it to compile but I have no idea if the result will work as intended.
The discussion of preparing data gives no hint of where you would download compatible data or transcripts. It tells you to run Kaldi scripts that barf and ask where your Fisher transcripts are.
The example has vague instructions to go read the Kaldi docs but doesn't even give a title or topic that you should go looking for.
The tutorial is full of acronyms that appear to have ASR-specific meanings that are never explained and that a user of MXNet would not reasonably be expected to know e.g. AMI does not mean "Amazon Machine Image". Similarly TIMIT is a speech corpus.

@Soonhwan-Kwon

@piiswrong @simoncorstonoliver
Our team had looked the example for 2 weeks about an year ago, and we skipped the few steps to work.
At first kaldi preprocessing on dataset took days.
And second we've made many detours to fill the gap of vague instructions.
But we referenced the network architecture of it and also method for reading configuration, and it was quite helpful.

@Soonhwan-Kwon @piiswrong
Glad to hear the tutorial was helpful for your project but the question really is whether it belong in the repo. We're trying to improve the quality of examples and would like to move to a world where the examples can be automatically validated for each release. If preprocessing the data using the external ASR tool Kaldi takes days then I propose that the tutorial should not be included in the repo.
if someone with expertise in ASR were to prepare some sample data that could be used with the reference network architecture then perhaps a new example tutorial could be created in the future, but for now let's remove it so it doesn't cause confusion on the web site for people who are new to MXNet.

Doesn't the speech_recognition example work? @simoncorstonoliver

I was not able to verify that it works. @Soonhwan-Kwon  says that people with more expertise than me were eventually able to get it working after filling in the missing/vague information and training for several days so I would say no, as it stands it doesn't work.

@piiswrong @simoncorstonoliver  I'm afraid that you've confused the author who wrote the speech-demo example(maybe pluskid?). The example I've made is speech_recognition.

@piiswrong  @simoncorstonoliver  I had make this work in February. what is the problem you must remove this example. just because you could not let it work?


Re-factor database extension and support cell_methods in ExperimentExplorer

Re-factor database extension and support cell_methods in ExperimentExplorer.
The re-factor has been on the cards for a while, and seemed like the best time to dive in.
Added hybrid properties model and is_restart to to NCFile. model infers the realm of the model from the ncfile path. is_restart is a boolean to identify restart variables and also inferred from the ncfile path.
Added hybrid property is_coordinate to CFVariable. This returns a boolean value which is True if this is a coordinate, False otherwise. It is inferred from the value of units.
All hybrid properties are accessible as a python method from a returned object and as a column in a query.
This is moving logic from explorer into the classes themselves to simplify and speed up using the explorer GUI elements.
Added inferred properties to get_variables when argument inferred is True.
get_variables can now return all variables from all experiments if experiment is None. In this case it will also return the experiment name.
Updated tests, but far from comprehensive.
Closes #273

The circleci check is just timing out, so can be ignored for the moment.
Still haven't actually added the cell_methods selector I realised, so will turn back into a draft ....

This is a working version but still have a few things to work on:

Need more tests, covering existing functionality and new cell methods addition
Too slow to start Experiment Explorer (15s) and Database explorer (22s CPU, 60s Walltime)
Sluggish when selecting/deselecting filtering coordinates and restart vars. Maybe triggering some event loop stuff?
Selecting cell methods works, but the time range is for all variables with the same frequency. Currently have no way to query for a time range based on a var + frequency + cell_methods, so don't have any way to update the time range. So it can be (almost certainly is) misleading.

New approach fixes the slow start-up times for the DatabaseExplorer and ExperimentExplorer
> %%time
> dbx = DatabaseExplorer(session=session)
CPU times: user 16.3 s, sys: 1.04 s, total: 17.3 s
Wall time: 17.3 s

> %%time
> ee = ExperimentExplorer(session=session, experiment='01deg_jra55v140_iaf')
CPU times: user 6.58 s, sys: 498 ms, total: 7.08 s
Wall time: 7.07 s

Just as a data point for later comparison the current COSIMA master DB is indexing 115 experiments containing 379590 individual files, 9.2M variables with 56M individual attributes.
No longer slow to filter restarts and coordinates.

what's the python version that conda-analysis3 runs?

3.9

21.04 uses 3.8. I don't think it is a big deal. It is some weird pytest related error. Doesn't happen outside of testing AFAICT.

I think this is ready for review now @angus-g if you have time.

I'll take a look now!

Thanks for checking and making those changes.
Regarding tests, if I'm honest no there aren't enough, but I ran out of motivation as creating them is a bit painful. I have added a test to make sure the hybrid model property is consistent between the two methods of invocation.
I'll take a look at the cell_methods stuff to make sure there is appropriate test coverage.

I take that back, clearly a more motivated me added a fair bit of test coverage for cell_methods. I think I'm happy to merge if you are @angus-g.


text-zipper.cabal: include hspec-discover as build tool

It is technically required to run the tests.

Hi @FliegendeWurst - thanks for your patch! I'll merge it since it should be harmless for folks who aren't planning on running the tests, but it isn't required unless someone wants to do that.


coq 8.6 support

current opam version fails to install with coq-8.6

Going to start a new branch for this.

Great! I just did a quick build and it compiles OK. There are few warnings about "Maximum Implicit Arguments" option, but I guess these are not critical. Do you plan to push it to OPAM soon?
Thanks again for your quick response!

I just opened a PR for opam-coq-archive (https://github.com/coq/opam-coq-archive/pull/125).

Just FYI, there is a problem installing it via OPAM: https://github.com/coq/opam-coq-archive/issues/126


Hidden Fields?

Hi, objection looks awesome, looking to switch from Bookshelf.
Is there a way to add hidden fields to an objection model? Say a User model has a password column containing a hash that I do not want returned in any JSON response. Bookshelf solves this by adding a static hidden array on the model, listing the fields I want hidden.
Any current solution? Couldn't find one in the docs.

Figured it out by overriding $formatJson on the base model

Just for a reference here is that function an user model of one of our projects.
   get $secureFields(): string[] {
    return ['pwhashcol', 'resettokencol', 'pwsaltcol'];
  }

  // omit stuff when creating json response from model
  $formatJson(json, options) {
    json = super.$formatJson(json, options);
    return _.omit(json, this.$secureFields);
  }

what do you do when you need it included back

Here's how I solved it:
import _ from 'lodash'
import { Model } from 'objection'

class CustomQueryBuilder extends Model.QueryBuilder {
  visible (...visible) {
    this.context({ visible })

    return this
  }
}

class Base extends Model {
  static get QueryBuilder () {
    return CustomQueryBuilder
  }

  static get hidden () {
    return []
  }

  $afterFind (queryContext) {
    const { hidden } = this.constructor
    const { visible } = queryContext

    if (hidden.length > 0) {
      const unset = _.difference(hidden, visible)

      for (const property of unset) {
        delete this[property]
      }
    }
  }
}

class User extends Base {
  static get hidden () {
    return ['email']
  }
}

// Query:

const publicUser = await User.query().first() // hidden email
const privateUser = await User.query().visible('email').first()

The specified fields are automatically hidden, but you can change this behavior by using the QueryBuilder visible() method.
The major downside is that you can't use any hidden property in your server-side code, because those properties are deleted after the model's retrieval.

Here's how I solved it:
import _ from 'lodash'
import { Model } from 'objection'

class CustomQueryBuilder extends Model.QueryBuilder {
  visible (...visible) {
    this.context({ visible })

    return this
  }
}

class Base extends Model {
  static get QueryBuilder () {
    return CustomQueryBuilder
  }

  static get hidden () {
    return []
  }

  $afterFind (queryContext) {
    const { hidden } = this.constructor
    const { visible } = queryContext

    if (hidden.length > 0) {
      const unset = _.difference(hidden, visible)

      for (const property of unset) {
        delete this[property]
      }
    }
  }
}

class User extends Base {
  static get hidden () {
    return ['email']
  }
}

// Query:

const publicUser = await User.query().first() // hidden email
const privateUser = await User.query().visible('email').first()

The specified fields are automatically hidden, but you can change this behavior by using the QueryBuilder visible() method.
The major downside is that you can't use any hidden property in your server-side code, because those properties are deleted after the model's retrieval.

This works great! Thanks so much for sharing. However, the only issue I found with this approach is that if we use it with modifyGraph like this, it doesn't just make the fields visible for notifications as we would want, it makes them visible for all models including User and Notifications:
const station = await User.query().findById(userId).withGraphFetched({
    notifications: true,
}).modifyGraph('notifications', builder => {
    builder.visible('createdAt', 'updatedAt');
}).first();

How could this be fixed?


[Bug] Having any symlinked files causes railway up failure

Steps to reproduce

Have a project that can be deployed to railway using railway up
use ln -s to create any symlink within that project

it does not matter if it is committed or not, or stable or not

This symlink will work locally, but trying to deploy with the following command will cause railway to error, with the following error:

$ railway up
🚝 Laying tracks in the clouds... archive/tar: write too long

System info
Linux <IP_ADDRESS>-microsoft-standard-WSL2 x86_64 x86_64 x86_64 GNU/Linux
Railway --version
railway version 0.2.43

Steps to reproduce

Have a project that can be deployed to railway using railway up
use ln -s to create any symlink within that project

it does not matter if it is committed or not, or stable or not

This symlink will work locally, but trying to deploy with the following command will cause railway to error, with the following error:

$ railway up
🚝 Laying tracks in the clouds... archive/tar: write too long

System info
Linux <IP_ADDRESS>-microsoft-standard-WSL2 x86_64 x86_64 x86_64 GNU/Linux
Railway --version
railway version 0.2.43

Were you able to resolve this issue? I have been facing this problem too.

Hey y'all-
Sorry for the late reply but you'll be pleased to know that we have fixed this issue with: https://github.com/railwayapp/cli/pull/170


Congratulation

For a first release, the code is clean and quite easy to read. I wish you all the best with openbgp.
It is just unfortunate that a popular open source daemon called "openbgpd" already exists ( http://www.openbgpd.org/ ). You may want to consider another name for your project ( it is not too late ) or at least make sure the daemon is not called the same as openbsd's one.
Oh, and do not do my mistake and use __str__ for anything: like you did with "construct", use a different function to generate string representation of BGP objects.
Best of luck.

hi Thomas
First I want to thank you! we wrote this project in 2011 within Cisco as an internal project, and at that time I reference your exabgp(the version is 1.3.4 :+1: ), your code gave me many many inspirations. And thanks for your advise, I will keep on going.
yes, I can change the daemon name from openbgpd to another name. For the project name, I knew there is a project called openbgpd,  but I also found there are no packages named openbgp in pypi,  so I wonder if it is possible for me to keep the package name as openbgp?
And the same issue happened in openbmp, our another Python BMP project (It was written during 2013 I think). But almost half a year ago, there is a Cisco guy open sourced one BMP project called OpenBMP written in C language.
So if I want to keep the package name as openbgp or openbmp in github and pypi, is there any problem in future?  I am not familiar with open source policy, please help me.
BR,
Peng Xiao

Hi Peng,
You can not always avoid name clashes as there is not policy.
But knowing release with a name similar to an existing project with cause you a few issues:

people googling will find both project, as openbgpd has been going for a long time are likely to find the wrong answers/project
if you software need to be packaged by a openbsd ( I do not think openbgpd is packaged for other os ) then you will have a name clash

Overall it is confusing for the user, hence why it is preferable, nothing more.
Sincerely,
Thomas

thanks, I will think about a new name for our project


Sounds seem to never be cached

Hey,
I just tried out your lib as mentioned in #20 and another thing that I noticed is, that apparently soundfiles are never cached by the browser and therefore the whole file is fetched on every play. Is there anything I could do to mitigate this?
Thanks in advance :)

nevermind, I had my devtools open and the browser cache disabled 😅


Budget Monitor v1.0

This PR is raised as the initial release of my Budget Monitor app where it follows these requirements:
Design

You should follow these design guidelines, including:

Colors.
Typography: font face, size and weight.
Layout: composition and space between elements.

NOTE: In these design guidelines there are several UIs that you won't need for this exercise; also, some pages are not given a design and you will create them following the design guidelines of the other pages.

Original design idea by Gregoire Vella on Behance.
The Creative Commons license of the design requires that you give appropriate credit to the author. Therefore, you must do it in the README of your project.
Interactions

Splash screen

A simple page with the name of your app (yes, you need to choose one), and links to the sign up and log in pages.

Sign up and log in pages

The user should be able to register in the app with full name, email and password (all mandatory).
The user can log into the app using email and password.
If the user is not logged in, they can't access pages that require the user to be logged in (all the pages described below).

Home page (categories page)

When the user logs in, they are presented with the categories page.
For each category, the user can see their name, icon and the total amount of all the transactions that belongs to that category.
When the user clicks (or taps) on a category item, the application navigates to the transactions page for that category.
There is a button "add a new category" at the bottom that brings the user to the page to create a new category.

Transactions page

For a given category, the list of transactions is presented, ordered by the most recent.
At the top of the page the user could see the total amount for the category (sum of all of the amounts of the transactions in that category).
There is a button "add a new transaction" at the bottom that brings the user to the page to create a new transaction.
When the user clicks on the "Back" button (<), the user navigates to the home page.

"Add a new category" page

The user fills out a form to create a new category, indicating their name and icon (both mandatory).
The user clicks (or taps) the "Save" button to create the new category, and is taken to the home page on success.
When the user clicks on the "Back" button (<), the user navigates to the home page.

"Add a new transaction" page

The user fills out a form to create a new transaction with:

name (mandatory)
amount (mandatory)
categories (mandatory at least one)

The user click (or taps) the "Save" button to create the new transaction, and is taken to the transactions page for that category.
When the user clicks on the "Back" button (<), the user navigates to the transactions page for that category.

Testing requirements

Create unit and integration tests for all the most important components of your RoR application.

Technical requirements

You should use Postgres as your database.
You should use devise for authentication.
You should validate all user input to make sure that anyone with bad intentions cannot compromise your app.
You can use a view template engine of your choice (.erb, .slim, .haml).
The project should be deployed and accessible online.
Your database schema should reflect the following structure:

NOTE: do not change column names visible in the diagram. You need to change the "Entity"  name according to the theme you have chosen for your project (please note: "Transaction" is a name already used by ActiveRecord, so using it as a name for your model and table will result in an error).

Project documentation
Once you have finished the development of the project, you should record a video presenting the features of the project you built. It is a video with a maximum length of 5 minutes. The content of the video should include:

a description of the project.
a demo of the project features.
you should also highlight some interesting piece of code or something you built that you are very proud of.

For recording the video you can use tools like Loom that let you share a private link to the recording, and configure a shot that shows your computer screen and your face at the same time in a small picture.

If there are problems with the tests becasue of tailwind, please precompile assests with this command first "bin/rails assets:precompile"

Thank you @ridwanediallo for the thorough review, I addressed all of the required changes 🥳

I made sure all tests are passing before submission, I don't understand why it doesn't show for me locally. However, I did some modifications according to the image attached in the review


fix broken links

Description

Related Issue(s)

Checklist

[ ] I have read the contribution guidelines
[ ] I have considered the performance impact of these changes
[ ] Suitable unit/system level tests have been added and they pass
[ ] Documentation has been updated

Thanks @zackwasli !


'Watched' tab doesn't apply filters

复现步骤 / Step to reproduce

Open app
Go to 'Watched' tab
Tap 'Filter' icon
Select filters to apply (i.e. show only 'Image Set'; minimum rating 3 stars)
Tap on 'Done' check mark to apply selected filters

预期行为 / Expected behaviour
It should apply the selected filters.
实际行为 / Actual Behaviour
It doesn't apply any filters (i.e. shows 'Image Set' but also 'Doujinshi' and others; shows galleries with rating below 3 stars).
应用日志 / App logs
🐛 init LogUtil success
🐛 init UserSetting success
🐛 init TabBarSetting success: default
🐛 init SiteSetting success
🐛 init FavoriteSetting success
🐛 init MyTagsSetting success
🐛 init EHSetting success, site: EH
🐛 init EHCookieManager success, cookies length:7
🐛 init EHCacheInterceptor success
🐛 init ReLoginService success
🐛 init DownloadSetting success
💡 System Proxy Address:
🐛 init EHRequest success
🐛 init PreferenceSetting success
🐛 init TagTranslationService success
🐛 init MouseSetting success: default
🐛 init QuickSearchService success
🐛 init SearchHistoryService success
🐛 init SuperResolutionSetting success: default
🐛 init SuperResolutionService success
🐛 init ReadSetting success: default
🐛 init HistoryService success
🐛 init Gallery groups: []
🐛 init Archive groups: []
🐛 init DownloadService success, download task count: 0
🐛 start download executor
🐛 init ArchiveDownloadService success. Tasks count: 0
💡 SimpleDashboardPageLogic get data, prevGid:null, nextGid:null
💡 refresh FavoriteSetting
💡 refresh SiteSetting
💡 refresh EHSetting
💡 refresh MyTagsSetting
🐛 init VolumeService success
💡 Refresh local gallerys, preCount:0, newCount: 0, timeCost: 28ms
💡 Resize window to: 384.0 x<PHONE_NUMBER>666667
💡 Latest version:[v7.4.5], current version: [v7.4.5]
💡 refresh EHSetting success
💡 refresh MyTagsSetting success, length: 47
💡 refresh FavoriteSetting success
💡 refresh SiteSetting success
💡 WatchedPageLogic get data, prevGid:null, nextGid:null
💡 WatchedPageLogic get data, prevGid:null, nextGid:null
备注 / Addition details
It would be nice if it also remembered the filters after closing the app (like 'Home' tab does).
JHenTai 版本号 / JHenTai version
7.4.5+2144
操作系统版本 / operating system version
Android 13
设备型号 / Device model
Samsung Galaxy S22 Ultra
自查步骤 / Verify steps

[X] 您已仔细查看并知情 常见问题 中的内容 / You have checked Q&A carefully
[X] 您已搜索过 Issue Tracker，没有找到类似内容 / I have searched on Issue Tracker, No duplicate or related open issue has been found
[X] 您确保这个 Issue 只提及一个问题。如果您有多个问题报告，烦请发起多个 Issue / Ensure there is only one bug report in this issue. Please make mutiply issue for mutiply bugs
[X] 您确保已使用最新版本测试，并且该问题在最新版本中并未解决 / This bug have not solved in latest version

Yes, this is a known issue, and it have been fixed in https://github.com/jiangtian616/JHenTai/commit/fd0795ccc4e2380f3c930044878b2d7684f16253 , it will be fixed in the next version.

Amazing! thank you, I will close this issue now, but I would not like for it to be shown in my activity...could you please delete it for me?

May be you can hide you activity, i think i have no access to delete something not related to me on github.

I checked and actually it seems to be the other way around: I can't hide an issue of mine on other's repos, but the repo's owner can: https://docs.github.com/en/issues/tracking-your-work-with-issues/deleting-an-issue

Sure, if you want.


Exposes NodeComponentProps

This type needs to be exposed in order to properly type custom node components, see issue #81

also as a work-around, I believe this is the equivalent type for anyone wondering
import { ListChildComponentProps } from 'react-window';
import { NodePublicState } from 'react-vtree/dist/es/Tree';

type ITreeWalkerData = {
 // This is your data model
}

type TreeNodeComponentProps = ListChildComponentProps<ITreeWalkerData> & NodePublicState<ITreeWalkerData>;


do not error on unspecified flags

We are trying to use nomnom in gulp 4.0, but we've always supported passing flags gulp doesn't use along to the gulpfile for users to switch on, etc.  Someone opened https://github.com/gulpjs/gulp/issues/780 and I confirmed that an unspecified flag shows the error message.  This change makes the current behavior work for specified flags and doesn't error on unspecified flags.

:+1:

:+1:


Kafka Config: Type info mapping are not avaible in the header

I was creating a simple Kafka producer code and consumer code using the following API definition
asyncapi: 2.0.0
info:
  title: Banking backend events
  version: 1.0.0
servers:
  development:
    url: localhost:{port}
    protocol: kafka
    variables:
      port:
        default: '9092'
channels:
  banking.transaction.000:
    description: |-
      This contains events related to transactions.
    publish:
      operationId: consumeTransactionEvent
      message:
        $ref: '#/components/messages/transactionEvent'
      bindings:
        kafka:
          groupId: myGroupId

components:
  messages:
    transactionEvent:
      name: trasactionEvent
      contentType: 'application/json'
      payload:
        $ref: '#/components/schemas/TransactionEventPayload'
  schemas:
    TransactionEventPayload:
      type: object
      properties:
        transactionId:
          description: Transaction Id
          type: string
        amount:
          type: integer

When I was posting a message to Kafka using the producer code and then consuming it from the consumer code, I was getting the following error :
java.lang.IllegalStateException: No type information in headers and no default type provided

I searched around this problem and I figured out there is something wrong with the config created for the producer.
I see that at this location:  https://github.com/asyncapi/java-spring-template/blob/ba5cf9f5457ccb59518906c4028fd3b50dcc22b0/partials/KafkaConfig.java#L60
but setting this to false causes the next line in the code  i.e https://github.com/asyncapi/java-spring-template/blob/ba5cf9f5457ccb59518906c4028fd3b50dcc22b0/partials/KafkaConfig.java#L61
to not add mapping in the header and hence on the consumer side it fails, since it can't find any mapping in the header.
Expected behavior
I guess the value has to be set to true to allow the producer to add the mapping to the header.
Issue 2:
There is one more issue I saw, the headers that are set while sending the message using the Kafka template send method inside the PublisherService are also not populated in the headers section of the message.

I can create a merge request for this fix for the ADD_TYPE_INFO_HEADERS


[release-4.6] Bug 2032314: Avoid hardcoding the JMSAppender-related JARs

Signed-off-by: timflannagan<EMAIL_ADDRESS>

Manually adding the required labels. See https://coreos.slack.com/archives/CJARLA942/p1639507843420000 for more information.


Release v0.6.0

Did I miss anything in the changelog? How do the subheaders look? I organized the fixes to break the giant list of changes up.
rendered

v0.6.0 - Sinbad's Revenge!

*drops smoke pellet*  *hides* :fearful: