Lightbox

From Frack - Hackerspace Friesland
Jump to navigationJump to search
Project: Lightbox
Lightbox Project.jpg
Status voltooid
Betrokkenen
Gebruiker Elmer.jpg Elmer
Gebruiker Elmer.jpgElmer de Looff (Elmer) Rol: niet-deelnemer Deskundig met: Arduino, ENC28J60, Elektronica, GnuCash, HTML, LPD8806, Linux, MediaWiki, Mercurial, Netwerken, OpenVPN, Programmeren, Python, SSH, Software, Solderen Beginnend met: Dm-crypt, Javascript Werkt aan: Geen projecten :(
Kennisgebied(en) Python, Javascript
Projectcode Lightbox
Afgeleid van: Twitterboom
ProjectoverzichtProject toevoegen

Lightbox is een Python library voor het aansturen van ledverlichting. Het zorgt voor vloeiende overgangen en meerlaagse kleurmenging. Het is origineel ontwikkeld voor het Twitterboom project (Kerst 2011) maar is sinds die tijd sterk doorontwikkeld.

In vogelvlucht

Op het laagste niveau bevindt zich de Controller. Deze ontvangt de gegenereerde kleurinstructies en communiceert deze naar de hardware. Eventuele periodieke acties om de verbonden hardware aan te houden worden ook door deze controller verzorgd.

Elke controller heeft een aantal uitgangen (Output objecten). Deze abstraheren de RGB ledstrips of -spots die verbonden zijn aan de hardware. Binnen elk van deze uitgangen bevinden zich een aantal lagen (Layer objecten) die elk een eigen kleur, doorzichtigheid en mengfunctie hebben. Een aantal keer per seconde wordt de samengestelde kleur berekend en doorgestuurd naar de controller, die deze dan doorstuurt naar de hardware.

De lagen ontvangen instructies voor kleurovergangen (Transition objecten). Deze bepalen de nieuwe kleur en doorzichtigheid van de laag en in hoeveel stappen deze gerealiseerd moet worden. Een laag kan voorzien worden van een grote hoeveelheid kleurovergangen die dan een voor een doorlopen zullen worden.

Detailoverzicht

Controller

  • Abstracted design that ideally supports many different hardware implementations
  • Support for one or multiple outputs
  • Keepalive system for hardware that desires it
  • Sequential or 'random' stepping through available outputs (random guarantees no output is used twice in a row)

Output

  • Outputs provide smooth fades using an envelope of choice (cosine and linear are provided)
  • Transitions calculated in Lab color space for improved perceived smoothness
  • Output power can be adjusted to (slightly) correct for nonlinearity of perceived output intensity
  • Outputs combine multiple (3) layers that blend into one output color

Layer

  • Layers have both a color and opacity, which, combined with the specified blend function determine the additive color effect of each layer.
  • Each layer has its own transitions (or static color after transitions end), queued up for greater control
  • Channels can be combined into a single output color using various blend methods:
    • RgbAverage -- Naive average function of RGB values;
    • LabAverage -- Averages the L, a, and b values of the different channels;
    • Lighten -- The highest red, green and blue values are used, yielding the brightest mixed color;
    • Darken -- The darkest red, green and blue values are used, yielding the darkest mixed color;
    • RootSumSquare -- For each red/green/blue, the root of all squared channels is returned.

Transition

Argumenten

  • color = None (= current for layer)
  • opacity = None (= current for layer)
  • duration = 0 (= instant)
  • layer = 0
  • blendmode = utils.LabAverage
  • envelope = utils.CosineFactor
  • chain = True (False to clean queue and perform this operation)
  • withreverse = False (True: upon completion, perform the Transition again in reverse; this implements blinking)
  • callback = None (optional function to call when Transition has completed)

Demo applicaties

In de GitHub repo zijn twee demonstratie-applicaties bijgeleverd die de functionaliteit van Lightbox demonsteren:

  • demo
  • layer_demo

API

Om de Lightbox software gemakkelijk aanstuurbaar te maken over het netwerk is er een JSON API ontwikkeld. Op deze manier is het mogelijk voor meer mensen of applicaties om dezelfde hardware aan te sturen.

Een Lightbox API server is gemakkelijk te starten met de api_server applicatie in de root van de GitHub repo. Deze start standaard met de controller die voor het Twitterboom project is gemaakt, maar is aan te passen door gebruik te maken van de --controller optie.

Ook kan een API server gestart worden zonder dat er hardware gekoppeld is, dit door gebruik te maken van een dummy controller:

./api_server -c Dummy

Live demo

Bij de Lightbox API server is ook een HTML "live view" pagina beschikbaar. Hier zijn de kleuren van alle uitgangen en individuele lagen te zien, ook zonder dat de hardware beschikbaar is (gebruikmakend van de eerdergenoemde Dummy controller). Dit overzicht is beschikbaar op de Lightbox API host en poort, standaard http://localhost:8000/.

API commando's

Een API commando beschrijft een of meer kleurovergangen. Hieronder staat een voorbeeld dat de onderste laag van vijf uitgangen kleur geeft:

[
    {
        "output": 0,
        "color": [255, 0, 0],
        "opacity": 1,
        "steps": 40
    },
    {
        "output": 1,
        "color": [255, 128, 0],
        "opacity": 1,
        "steps": 40
    },
    {
        "output": 2,
        "color": [255, 255, 0],
        "opacity": 1,
        "steps": 40
    },
    {
        "output": 3,
        "color": [255, 128, 128],
        "opacity": 1,
        "steps": 40
    },
    {
        "output": 4,
        "color": [255, 0, 255],
        "opacity": 1,
        "steps": 40
    }
]
def FadeToBlack(output, layer, duration, chain=True):
  output.Transition(
      color=BLACK, 
      opacity=1, 
      duration=duration, 
      layer=output.layer[-1],
      blendmode=utils.Darken, 
      callback=(Reset, (output, layer)))
 
def Reset(output, layer):
  output.Transition(color=(0, 0, 0), opacity=0, layer=layer, chain=False)
 
def ResetAll(output):
  for layer in range(len(output.layers)):
    output.Transition(color=(0, 0, 0), opacity=0, layer=layer, chain=False)

API applicaties

Er zijn inmiddels een aantal applicaties die de Lightbox API aanspreken:

colourlovers

De 100 mooiste en populairste kleurpaletten van colourlovers.com worden per stuk een minuut lang getoond. Dit zorgt ervoor dat de lounge hoek altijd leuk verlicht is.

Gerealiseerd door

Gebruiker Lijnenspel.jpg Lijnenspel
Gebruiker Lijnenspel.jpgJelle (Lijnenspel) Rol: niet-deelnemer Deskundig met: Arduino, Programmeren, Sammy Werkt aan: Geen projecten :(

.

spacestate

Wanneer de space gesloten is, wordt op het hoogste kanaal een zwarte tint afgedwongen, op die manier is de verlichting niet te zien. Wanneer de deur wordt geopend worden alle uitgangen naar felgroen gestuurd, waarna het groen langzaam wegtrekt en de onderliggende kleuren zichtbaar worden.

Wanneer de space op slot wordt gedaan kleuren alle strips rood en zullen ze kort hierop geheel donker worden.

Gerealiseerd door

Gebruiker Elmer.jpg Elmer
Gebruiker Elmer.jpgElmer de Looff (Elmer) Rol: niet-deelnemer Deskundig met: Arduino, ENC28J60, Elektronica, GnuCash, HTML, LPD8806, Linux, MediaWiki, Mercurial, Netwerken, OpenVPN, Programmeren, Python, SSH, Software, Solderen Beginnend met: Dm-crypt, Javascript Werkt aan: Geen projecten :(

twitter_colors

Een plugin afgestamd van de oude Twitterboom code. Via de Twitter JSON API worden recente tweets voor een aantal hashtags opgezocht en hier worden kleuren uit gedestilleerd die daarna naar de API worden gestuurd. Kleuren worden op drie wijzen uit berichten gehaald:

  1. HTML-kleurcodes (van het soort "#ff455a") worden direct gelezen en de eerste wordt gebruikt als kleurwaarde.
  2. Als de vorige stap geen kleur oplevert wordt het bericht doorzocht op kleurnamen. Er is een lijst van ongeveer 100 Nederlandse kleurnamen naar welke wordt gezocht in het bericht. Wanneer er daar een of meer van voorkomen wordt een willekeurige kleur daarvan gebruikt.
  3. Als het bovenstaande ook niets oplevert wordt het bericht gehashed en wordt het resultaat modulo 2^24 gebruikt als kleurwaarde (dit levert een 24-bit kleur op).

Na elke tweet wordt 2 seconden gewacht voordat op de volgende ledstrip de volgende kleur verschijnt.

Gerealiseerd door

Gebruiker Elmer.jpg Elmer
Gebruiker Elmer.jpgElmer de Looff (Elmer) Rol: niet-deelnemer Deskundig met: Arduino, ENC28J60, Elektronica, GnuCash, HTML, LPD8806, Linux, MediaWiki, Mercurial, Netwerken, OpenVPN, Programmeren, Python, SSH, Software, Solderen Beginnend met: Dm-crypt, Javascript Werkt aan: Geen projecten :(

.

Ideeën

  • Deurbel: de lichten laten knipperen wanneer er op de bel wordt gedrukt
  • Volumemeter: de verlichting dimmen wanneer het luid is in de space, alsof het het display is van een overbelaste versterker