@gallaghersart from what I understand now, it can be handled in daemon.g, maybe in a submacro for better structure.
You'd have to make extensive use of variables. The macro could be something like this (mockup):
determine RGB values for each individual "light" (=group of LEDs), much like @zapta 's example, according to your specification. Store in variables (e.g. "R_group1, U_group1, B_group1, R_group2 ...")
send M150 string at the end of the macro:
M150 R{R_group1} U{B_group1} B{B_group1} S{[number of LEDs in first group]} P{P_group1} F1
M150 R{R_group2} U{B_group2} B{B_group2} S{[number of LEDs in second group]} P{P_group2} F1
M150 R{R_group3} U{B_group3} B{B_group3} S{[number of LEDs in third group]} P{P_group3} F0
this way, all RGB values for the whole strip would be send at once, which was what my initial confusion was about.
If this macro is called regularly in daemon.g, it should all be quite smooth.
another thing is "blinking"; this would be more difficult. It could be done with a variable for brightness that is changed in each iteration of daemon.g, e.g.
P_group1 = 255 (initialised once at start, e.g. in config.g)
P_group2 ...
P_sign = 1
then in daemon.g:
if {P_group1} == 0 || {P_group1} == 255
P_sign = -P_sign
if {P_group1} < 255 && {P_group1} > 0
P_group1 = P_group1 + (P_sign*5)
this way in each iteration of daemon.g, the brightness value is changed. the speed of blinking is dependent on how often daemon.g is called (I understand that this can be adjusted) and the value added in the last operation (e.g. 5)
note: not tested, just what I imagine could work.
I think there has been a request for a more elaborate way of handling LED colours before. Until then, we'd have to work like this.
best, Niklas