This colour-changing mood light effect might be described as a colour 'bounce'. It fades up to the brightness setting, waits for the Top pause, then fades back down to Off, waits for the Bottom pause, then repeats the cycle with the next colour (see demo video) .
The colours are assigned in a list, and can either be sequentially cycled, or randomly chosen. Either way, the next colour should always be different to the present colour to keep it more interesting. If you prefer not to include white cos its not interesting enough, simply delete it from the list. The brightness, colour change speed, and top and bottom pauses, are all individually adjustable.
The 'bounce' action can be toggled On or Off to freeze the bounce at any time.
All the defaults are commented at the top of the script for easy modification if wished.The script was developed on Annex 1.41 beta 2, so needs that version or later for all features to work. It may eventually be combined with the previous colour 'blend' into a 'mood lighting' script - some of the similarities are repeated below... The
Brightness control reduces the peak brightness level by decreasing the
required number of discrete steps. This also affects the colour-change
speed, because although the rate of change stays the same, there will be a differing number of steps to sequence through.This is easily shown by setting the Speed slider at it fastest
(right) while first trying the Brightness at dim (left), then turning up the brightness.
You can set the script name into Config Autorun for automatic startup rather than needing to Run it from the browser each time.
In which case you may wish to enter credentials to automatically log on to your router and display the Output control page.
So a word of caution for Sonoff B1 users... be sure you can connect to the device in the browser before you set it to Autorun, because shorting TX and RX together to prevent Autorun on a Sonoff lamp is not quite so straightforward as on other devices.
Make sure to set either neo=1 or sonoff=1 according to which type of RGB device you are using, otherwise you won't see anything.
neo=1 'set=1 if using neo-pixels
sonoff=0 'set=1 if using a Sonoff B1 Lamp
Basic:
'Colour Bouncer for NeoPixels or Sonoff B1 Lamps - Electroguard - Developed on Annex 1,41 beta 2
title$="RGB Colour Bounce" 'title will be displayed if not blank neo=1 'set=1 if using neo-pixels sonoff=0 'set=1 if using a Sonoff B1 Lamp l=50 'brightness (Lux) from 0 (Off) to 255 (max) bounce=1 '1=bounce On, 0=bounce Off speed=30 'pause between individual bounce steps up=0 'bounce direction top=1300 'top of bounce pause bottom=500 'bottom of bounce pause random=1 '0=sequential colours, 1=random colours r=0:g=0:b=0:c=0 'startup defaults if neo=1 then 'data-in should be connect to gpio2 pixels = 12 'declare how many pixels to be addressed (12 for this example) neo.setup pixels 'initalise for declared number of pixels neo.strip 0, pixels-1 ,r,g,b 'turn all pixels off endif if sonoff=1 then sonoffb1.init 'initialise Sonoff B1 Lamp sonoffb1.rgb r,g,b 'display default RGB values sonoffb1.white 0,0 'display default white values endif colours$="red,green,blue,yellow,magenta,cyan,orange,purple,white" colours=word.count(colours$,",") colour=rnd(colours)+1 colour$=word$(colours$,colour,",") old$="" HtmlEventVar$="" onhtmlchange change gosub screen gosub bounce wait getcolour: if random=1 then old$=colour$ do colour$=word$(colours$,rnd(colours)+1,",") loop until colour$<>old$ else colour=colour+1 if colour>colours then colour=1 colour$=word$(colours$,colour,",") endif gosub colours rc=r/l: gc=g/l: bc=b/l return bounce: while bounce=1 do if c=0 then gosub getcolour if up=1 then c=c+1: if c>=l then c=l: up=0: pause top if up=0 then c=c-1: if c<=0 then c=0: up=1: pause bottom if sonoff=1 then cmd$="sonoffb1.rgb R,G,B" if neo=1 then cmd$="neo.strip 0, pixels-1,R,G,B" cmd$=replace$(cmd$,"R",str$(c*rc)) cmd$=replace$(cmd$,"G",str$(c*gc)) cmd$=replace$(cmd$,"B",str$(c*bc)) command cmd$ pause speed wend return change: if HtmlEventVar$="l" then gosub colours if bounce=1 then gosub bounce HtmlEventVar$="" return colours: select case colour$ case "red": r=l: g=0: b=0: case "orange": r=l: g=int(l/2): b=0: case "green": r=0: g=l: b=0: case "blue": r=0: g=0: b=l: case "yellow": r=l: g=l: b=0: case "magenta":r=l: g=0: b=l: case "purple": r=int(l/2): g=0: b=l: case "cyan": r=0: g=l: b=l: case "white": r=l: g=l: b=l: end select return screen: cls a$="" a$=a$+|<br>| a$=a$+|<div style='display: table; margin-right: auto; margin-left: auto;font-size: 110%'>| if title$<>"" then a$=a$+|<font color="teal">|+title$+|</font><br>| else a$=a$+"<br>" a$=a$+|<br>| a$=a$+|</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;'>| a$=a$ + checkbox$(bounce) a$=a$ + |<br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;font-size: 80%'> Bounce| a$=a$ + |<br><br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;'>| a$=a$ + checkbox$(random,"random") a$=a$ + |<br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;font-size: 80%'> Random| a$=a$ + |<br><br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;'>| a$=a$ + replace$(slider$(l, 0, 255,"L"), "onchange", "oninput") + |<br>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;font-size: 80%'>| a$=a$ + |<font color="black">|+" Brightness"+|</font><br><br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto; transform: rotate(180deg);'>| a$=a$ + replace$(slider$(Speed,0,999,"S"), "onchange", "oninput") +|<br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;font-size: 80%'>| a$=a$ + |<font color="black">|+" Speed"+|</font><br><br>| a$=a$+|</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;'>| a$=a$ + replace$(slider$(top, 0, 5000,"P"), "onchange", "oninput") + |<br>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;font-size: 70%'>| a$=a$ + |<font color="black">|+" Top pause"+|</font><br><br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;'>| a$=a$ + replace$(slider$(bottom,0,3000,"P"), "onchange", "oninput") +|<br>| a$=a$ + |</div>| a$=a$ + |<div style='display: table; margin-right: auto; margin-left: auto;font-size: 70%'>| a$=a$ + |<font color="black">|+" Bottom pause"+|</font><br><br>| a$=a$ + |</div>| a$=a$ + cssid$("P","width:90;") html a$ return end '-----------end------------ |