How to install Hyperion on the Raspberry Pi for ambilight

What is Hyperion?

Hyperion is another implementation of the ambilight, which seems to have a low cpu usage. After using hyperion, i can conclude it’s notably faster.

The following guide is for Raspberry Pi model B with the latest (march 2014) Raspbmc and 50 leds type ws2801.
I’ve used the same hardware setup as here: DIY Ambilight with raspberry pi

Updated! With OSMC and Raspberry Pi 2 😀
2 april 2015
Hyperion on OSMC and Raspberry Pi 2

Read: https://github.com/tvdzwan/hyperion

26 april 2014: Updated the colour settings for better colour experience. See below @Configure Hyperion

Contents
1. Install prerequisites
2. Install Hyperion
3. Configure Hyperion

In any case, stop boblight support within the raspbmc add-on. This is configured in Raspbmc settings under add-ons!

1. Install prerequisites

Start with

sudo -s

so you don’t have to type sudo everytime.

Then install the prerequisites

apt-get install git libqtcore4 libqtgui4 libqt4-network libusb-1.0-0 libprotobuf7 ca-certificates

I’ve included git for easy updating of Hyperion later.

2. Install Hyperion

Go back to the homedir

cd /home/pi

Download the installer script

wget -N https://raw.github.com/tvdzwan/hyperion/master/bin/install_hyperion.sh

Install with:

sh ./install_hyperion.sh

To test:

hyperion-remote –priority 50 –color red –duration 5000

3. Configure Hyperion

More information here:
https://github.com/tvdzwan/hyperion/wiki/configuration

Download HyperCon.jar
https://raw.github.com/tvdzwan/hypercon/master/deploy/HyperCon.jar

And configure following the manual in the link above.

Open the generated hyperion.config.json file from Hyperion.jar and copy the contents.

Go back to the terminal/putty and use the following command to open the hyperion config file:

vi /etc/hyperion.config.json

You can clear the contents of the file in vi with:

:1,$d

Paste the contents of your config, but press i (for insert mode) first!
ZZ to save and close

To restart Hyperion:

initctl restart hyperion

My configuration file is below. It’s not good to copy because WordPress messes the code up.
Fixed this, didn’t know there was a code tag..
I’ve used the following settings for a reasonable colour output. This is on a Raspberry Pi model B with ws2801. If you don’t want the bright colours, you can lower the saturationGain to 2.0000.
The only problem is that white images are blueish, but that can be fixed with some fine-tuning. Update for better colour output will come later.

Update: 26 april 2014. Updated the colour settings for the WS2801. The following settings are for the best colour experience so far. Note: Change whitelevel of red to 0.8000 if you want less red.

saturationGain : 2.2000
valueGain : 1.0000

red
threshold : 0.0000
gamma : 2.3000
blacklevel : 0.0000
whitelevel : 1.0000

green
threshold : 0.0000
gamma : 1.7000
blacklevel : 0.0000
whitelevel : 0.4000

blue
threshold : 0.2500
gamma : 1.5000
blacklevel : 0.0000
whitelevel : 0.2000

smoothing
type : “linear”
time_ms : 100
updateFrequency : 20.0000

The complete configuration with 50 leds ws2801


// Automatically generated configuration file for 'Hyperion daemon'
// Generated by: HyperCon (The Hyperion deamon configuration file builder

{
/// Device configuration contains the following fields:
/// * 'name' : The user friendly name of the device (only used for display purposes)
/// * 'type' : The type of the device or leds (known types for now are 'ws2801', 'ldp8806',
/// 'lpd6803', 'sedu', 'adalight', 'lightpack', 'test' and 'none')
/// * 'output' : The output specification depends on selected device. This can for example be the
/// device specifier, device serial number, or the output file name
/// * 'rate' : The baudrate of the output to the device
/// * 'colorOrder' : The order of the color bytes ('rgb', 'rbg', 'bgr', etc.).
"device" :
{
"name" : "MyPi",
"type" : "ws2801",
"output" : "/dev/spidev0.0",
"rate" : 250000,
"colorOrder" : "rgb"
},

/// Color manipulation configuration used to tune the output colors to specific surroundings.
/// The configuration contains a list of color-transforms. Each transform contains the
/// following fields:
/// * 'id' : The unique identifier of the color transformation (eg 'device_1') /// * 'leds' : The indices (or index ranges) of the leds to which this color transform applies
/// (eg '0-5, 9, 11, 12-17'). The indices are zero based. /// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following
/// tuning parameters:
/// - 'saturationGain' The gain adjustement of the saturation
/// - 'valueGain' The gain adjustement of the value
/// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the
/// following tuning parameters for each channel:
/// - 'threshold' The minimum required input value for the channel to be on
/// (else zero)
/// - 'gamma' The gamma-curve correction factor
/// - 'blacklevel' The lowest possible value (when the channel is black)
/// - 'whitelevel' The highest possible value (when the channel is white)
///
/// Next to the list with color transforms there is also a smoothing option.
/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning
/// parameters:
/// - 'type' The type of smoothing algorithm ('linear' or 'none')
/// - 'time_ms' The time constant for smoothing algorithm in milliseconds
/// - 'updateFrequency' The update frequency of the leds in Hz
"color" :
{
"transform" :
[
{
"id" : "default",
"leds" : "*",
"hsv" :
{
"saturationGain" : 2.2000,
"valueGain" : 1.0000
},
"red" :
{
"threshold" : 0.0000,
"gamma" : 2.3000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
},
"green" :
{
"threshold" : 0.0000,
"gamma" : 1.7000,
"blacklevel" : 0.0000,
"whitelevel" : 0.4000
},
"blue" :
{
"threshold" : 0.2500,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 0.2000
}
}
],
"smoothing" :
{
"type" : "linear",
"time_ms" : 100,
"updateFrequency" : 20.0000
}
},

/// The configuration for each individual led. This contains the specification of the area
/// averaged of an input image for each led to determine its color. Each item in the list
/// contains the following fields:
/// * index: The index of the led. This determines its location in the string of leds; zero
/// being the first led.
/// * hscan: The fractional part of the image along the horizontal used for the averaging
/// (minimum and maximum inclusive)
/// * vscan: The fractional part of the image along the vertical used for the averaging
/// (minimum and maximum inclusive)
"leds" :
[
{
"index" : 0,
"hscan" : { "minimum" : 0.1538, "maximum" : 0.2308 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 1,
"hscan" : { "minimum" : 0.0769, "maximum" : 0.1538 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 2,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0769 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 3,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 4,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.9000, "maximum" : 1.0000 }
},
{
"index" : 5,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.8000, "maximum" : 0.9000 }
},
{
"index" : 6,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.7000, "maximum" : 0.8000 }
},
{
"index" : 7,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.6000, "maximum" : 0.7000 }
},
{
"index" : 8,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.5000, "maximum" : 0.6000 }
},
{
"index" : 9,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.4000, "maximum" : 0.5000 }
},
{
"index" : 10,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.3000, "maximum" : 0.4000 }
},
{
"index" : 11,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.2000, "maximum" : 0.3000 }
},
{
"index" : 12,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.1000, "maximum" : 0.2000 }
},
{
"index" : 13,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1000 }
},
{
"index" : 14,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.1200 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 15,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0769 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 16,
"hscan" : { "minimum" : 0.0769, "maximum" : 0.1538 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 17,
"hscan" : { "minimum" : 0.1538, "maximum" : 0.2308 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 18,
"hscan" : { "minimum" : 0.2308, "maximum" : 0.3077 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 19,
"hscan" : { "minimum" : 0.3077, "maximum" : 0.3846 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 20,
"hscan" : { "minimum" : 0.3846, "maximum" : 0.4615 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 21,
"hscan" : { "minimum" : 0.4615, "maximum" : 0.5385 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 22,
"hscan" : { "minimum" : 0.5385, "maximum" : 0.6154 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 23,
"hscan" : { "minimum" : 0.6154, "maximum" : 0.6923 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 24,
"hscan" : { "minimum" : 0.6923, "maximum" : 0.7692 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 25,
"hscan" : { "minimum" : 0.7692, "maximum" : 0.8462 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 26,
"hscan" : { "minimum" : 0.8462, "maximum" : 0.9231 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 27,
"hscan" : { "minimum" : 0.9231, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 28,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1800 }
},
{
"index" : 29,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1000 }
},
{
"index" : 30,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.1000, "maximum" : 0.2000 }
},
{
"index" : 31,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.2000, "maximum" : 0.3000 }
},
{
"index" : 32,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.3000, "maximum" : 0.4000 }
},
{
"index" : 33,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.4000, "maximum" : 0.5000 }
},
{
"index" : 34,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.5000, "maximum" : 0.6000 }
},
{
"index" : 35,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.6000, "maximum" : 0.7000 }
},
{
"index" : 36,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.7000, "maximum" : 0.8000 }
},
{
"index" : 37,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.8000, "maximum" : 0.9000 }
},
{
"index" : 38,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.9000, "maximum" : 1.0000 }
},
{
"index" : 39,
"hscan" : { "minimum" : 0.8800, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 40,
"hscan" : { "minimum" : 0.9231, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 41,
"hscan" : { "minimum" : 0.8462, "maximum" : 0.9231 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 42,
"hscan" : { "minimum" : 0.7692, "maximum" : 0.8462 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 43,
"hscan" : { "minimum" : 0.6923, "maximum" : 0.7692 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 44,
"hscan" : { "minimum" : 0.6154, "maximum" : 0.6923 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 45,
"hscan" : { "minimum" : 0.5385, "maximum" : 0.6154 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 46,
"hscan" : { "minimum" : 0.4615, "maximum" : 0.5385 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 47,
"hscan" : { "minimum" : 0.3846, "maximum" : 0.4615 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 48,
"hscan" : { "minimum" : 0.3077, "maximum" : 0.3846 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
},
{
"index" : 49,
"hscan" : { "minimum" : 0.2308, "maximum" : 0.3077 },
"vscan" : { "minimum" : 0.8200, "maximum" : 1.0000 }
}
],

/// The black border configuration, contains the following items:
/// * enable : true if the detector should be activated
/// * threshold : Value below which a pixel is regarded as black (value between 0.0 and 1.0)
"blackborderdetector" :
{
"enable" : true,
"threshold" : 0.01
},

/// The configuration of the effect engine, contains the following items:
/// * paths : An array with absolute location(s) of directories with effects
/// * bootsequence : The effect selected as 'boot sequence'
"effects" :
{
"paths" :
[
"/opt/hyperion/effects"
]
},

"bootsequence" :
{
"effect" : "Rainbow swirl fast",
"duration_ms" : 3000
},

/// The configuration for the frame-grabber, contains the following items:
/// * width : The width of the grabbed frames [pixels]
/// * height : The height of the grabbed frames [pixels]
/// * frequency_Hz : The frequency of the frame grab [Hz]
"framegrabber" :
{
"width" : 88,
"height" : 88,
"frequency_Hz" : 10.0
},

/// The configuration of the XBMC connection used to enable and disable the frame-grabber. Contains the following fields:
/// * xbmcAddress : The IP address of the XBMC-host
/// * xbmcTcpPort : The TCP-port of the XBMC-server
/// * grabVideo : Flag indicating that the frame-grabber is on(true) during video playback
/// * grabPictures : Flag indicating that the frame-grabber is on(true) during picture show
/// * grabAudio : Flag indicating that the frame-grabber is on(true) during audio playback
/// * grabMenu : Flag indicating that the frame-grabber is on(true) in the XBMC menu
/// * grabScreensaver : Flag indicating that the frame-grabber is on(true) when XBMC is on screensaver
/// * enable3DDetection : Flag indicating that the frame-grabber should switch to a 3D compatible modus if a 3D video is playing
"xbmcVideoChecker" :
{
"xbmcAddress" : "127.0.0.1",
"xbmcTcpPort" : 9090,
"grabVideo" : true,
"grabPictures" : true,
"grabAudio" : true,
"grabMenu" : false,
"grabScreensaver" : true,
"enable3DDetection" : true
},

/// The configuration of the Json server which enables the json remote interface
/// * port : Port at which the json server is started
"jsonServer" :
{
"port" : 19444
},

/// The configuration of the Proto server which enables the protobuffer remote interface
/// * port : Port at which the protobuffer server is started
"protoServer" :
{
"port" : 19445
},

/// The configuration of the boblight server which enables the boblight remote interface
/// * port : Port at which the boblight server is started
// "boblightServer" :
// {
// "port" : 19333
// },

"endOfJson" : "endOfJson"
}

Sidebar