wiki removed - see notice

Moved to wiki.hyperion-project.org
brindosch 2016-04-29 23:57:25 +02:00
parent 99e691d38b
commit 7650b393d5
65 changed files with 7 additions and 2363 deletions

@ -1,19 +0,0 @@
A remote control for Android is available from the Google Play store. This remote control can be used to set the leds to a static color. No connection between the Hyperion remote and the Hyperion server needs to be present in order for the leds to stay on or to switch off after the optionally provided timeout.
<h4>Screenshots</h4>
![Color wheel](phone_colorwheel.png)
![Color transforms](phone_transforms.png)
![Effects](phone_effects.png)
![Drawer menu](phone_drawer.png)
![Settings screen](phone_settings.png)
<h4>Google play</h4>
The remote control can be downloaded from the Google Play store and is available in two flavors: a paid version and a free ad-supported version. Links to both versions of the app are provided below:
[Hyperion](https://play.google.com/store/apps/details?id=nl.hyperion.hyperionpro)
![QR code Hyperion](qrcode_hyperionpro.png)</td>
[Hyperion Free](https://play.google.com/store/apps/details?id=nl.hyperion.hyperionfree)
![QR code Hyperion Free](qrcode_hyperionfree.png)</td>

@ -1,78 +0,0 @@
# Introduction
AtmoOrb is a Philipe Hue like device which you can send color information over WiFi, it uses a simple network protocol and transmits it data over UDP multicast.
It offers much better performance over Hue with on average 1ms color changes depending on WiFi quality and can be controlled without the need of a bridge or additional IP configuration / pairing.
More information on how to build the AtmoOrb device can be found in the **Hardware** chapter.
# Setup
The settings options in your Hyperion configuration file are as follows:
```
....
"output" : "239.15.18.2", <-- Your Orb multicast group IP address, should match that of your Orb
"transitiontime" : 0, <-- not used / required but may allow for future delay configuration
"useOrbSmoothing" : false, <-- use Orbs own (external) smoothing algorithm when true, disable Hyperion smoothing to avoid double smoothing once set.
"skipSmoothingDiff" : 0, <-- minimal color (0-255) difference to override smoothing so that if current and previously received colors are higher than set dif we override smoothing (only used when useOrbSmoothing = true)
"port" : 49692, <-- Default multicast port, should match that of your Orb
"numLeds" : 24, <-- Number of leds per Orb, should match that of your Orb
"orbIds" : "1", <-- Comma separated list of all your Orbs, in example we only use a single id (1)
....
````
Generally you would only need to change the OrbIds and keep the rest default, here's a sample configuration using a Orb with ID 1:
https://gist.github.com/RickDB/dfbb39c16a556ffe591b
The skipSmoothingDiff setting allows for faster transitions when the minimal color difference is defined (0-255), for instance if you go from full white to black it can clear smoothing right away for instant color change however this is only used when Orbs smoothing is enabled (useOrbSmoothing = true).
Make sure that if you set useOrbSmoothing to true that you don't enable Hyperion smoothing as that will result in double smoothing (extra delays)
Graphical configuration is possible with HyperCon.
## Multi zone configuration
In the LEDs area of your Hyperion configuration file the index is used as follows:
```
Index 0 = Orb ID 1
Index 1 = Orb ID 2
..and so forth
```
So you can define several Orb IDs in the orbIds setting from earlier and in the LEDs area you can define which scan area it utilizes, here's an example of 2 Orbs (ID 1 and 2) with different scan areas:
```
.....
"output" : "239.15.18.2", <-- Your Orb multicast group IP address, should match that of your Orb
"transitiontime" : 0, <-- not used / required but may allow for future delay configuration
"port" : 49692, <-- Default multicast port, should match those of your Orb
"numLeds" : 24, <-- Number of leds per Orb
"orbIds" : "1,2", <-- Comma separated list of all your Orbs, in example we use a single id (1)
"switchOffOnBlack" : true, <-- Switch Orb off on black
.....
"leds" :
[
{
"index" : 0,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.5000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.5000 }
},
{
"index" : 1,
"hscan" : { "minimum" : 0.5000, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.5000, "maximum" : 1.0000 }
}
],
```
You can have Orbs with the same ID so this only required for multiple Orb setups where you need different scan areas.
# Hardware
It consists of a Particle Photon (Arduino-ish with WiFi) and Neopixel led ring which you can optionally extend with additional WS2812 LEDs using its data out, for complete build instructions you can check out this tutorial:
http://forum.team-mediaportal.com/threads/diy-atmoorb-a-hue-like-mood-lamp-based-on-particle-photon-with-neopixel-tutorial-added.131901/
You can skip the AtmoLight setup part there as Hyperion will be controlling it in this case

@ -1,195 +0,0 @@
To achieve a 'perfect' color we should follow these steps:
####Step 1. Whitelevel
The led strips channels dont have always the same perceived amount of color, that's why when we see a white image the leds are a bit reddish, greenish or bluish. To correct that behaviour, we need to limit the output or one or two channels so we perceive a perfect white.
To do that, here is a full white image pattern that we can use:
[White PNG](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/Gamma/FFFFFF.png)
To adjust the colors we have to change the part of the hyperion.config.json that lets us define the pure colors:
```
"channelAdjustment" :
[
{
"id" : "default",
"leds" : "*",
"pureRed" :
{
"redChannel" : 255,
"greenChannel" : 0,
"blueChannel" : 0
},
"pureGreen" :
{
"redChannel" : 0,
"greenChannel" : 255,
"blueChannel" : 0
},
"pureBlue" :
{
"redChannel" : 0,
"greenChannel" : 0,
"blueChannel" : 255
}
}
],
```
At this first step, we only have the change the redChannel of pureRed, greenChannel of pureGreen and blueChannel of pureBlue until we get a pure White, the other values must be 0.
####Step 2. Gamma correction
Now that we have a corrected white, we need to adjust the perceived curves all the way from black to white. Here is a link that explains perfectly what happens with the perceived color levels:
[The gamma issue](https://learn.adafruit.com/led-tricks-gamma-correction/the-issue)
So, now we have a pure white and we have to adjust LED gamma levels. A good start is always setting a gamma level of 2.5 on each channel, here is the part of the code:
```
"transform" :
[
{
"id" : "default",
"leds" : "*",
"hsl" :
{
"saturationGain" : 1.0000,
"luminanceGain" : 1.0000
},
"red" :
{
"threshold" : 0.0000,
"gamma" : 2.5000
},
"green" :
{
"threshold" : 0.0000,
"gamma" : 2.5000
},
"blue" :
{
"threshold" : 0.0000,
"gamma" : 2.5000
}
}
],
```
As you can see there is the same amount of gamma calibration for each channel, but as we explained before the channels don't behave the same way, so gamma correction will not be the same for each channel. To help us with gamma calibration here are eight more images:
[Black](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/000000.png)
[Grey (3F3F3F)](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/3F3F3F.png)
[Grey (7F7F7F)](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/7F7F7F.png)
[Grey (BFBFBF)](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/BFBFBF.png)
[Horizontal Gradient 1](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/HGradient_1.png)
[Horizontal Gradient 2](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/HGradient_2.png)
[Vertical Gradient 1](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/VGradient_1.png)
[Vertical Gradient 2](https://github.com/AEtHeLsYn/hyperion/raw/master/doc/calibration/Gamma/VGradient_2.png)
What you have to do is, by using these images, adjust gamma levels of each channel until you have the same perceived amount of each channel. For example, if your Grey (3F3F3F) is a bit reddish it means that we have to _increase_ red gamma to reduce the amount of red (the more gamma, the less amount of color). When you have all the images with colors calibrated we can go to the next step.
###Step 3. Channel adjustment.
After we have the led strip gamma corrected and white leveled we can adjust the led strip colors. As you all know, there is really difficult to perceive the same color at the same time at display and led strip. That's because your TV/monitor does a color adjustment to the received imaged. Therefore, we should mimic that color adjustment to get the same color output. To help us with that here we have some image patterns:
[red (FF0000)](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/RGB/red_FF0000.png)
[green (00FF00)](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/RGB/green_00FF00.png)
[blue (0000FF)](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/RGB/blue_0000FF.png)
[cyan (00FFFF)](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/RGB/cyan_00FFFF.png)
[magenta (FF00FF)](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/RGB/magenta_FF00FF.png)
[yellow (FFFF00)](https://raw.githubusercontent.com/AEtHeLsYn/hyperion/master/doc/calibration/RGB/yellow_FFFF00.png)
What we should do here? Well, adjust LED channels using the same part of the configuration that we used at the beginning:
```
"channelAdjustment" :
[
{
"id" : "default",
"leds" : "*",
"pureRed" :
{
"redChannel" : 255,
"greenChannel" : 0,
"blueChannel" : 0
},
"pureGreen" :
{
"redChannel" : 0,
"greenChannel" : 255,
"blueChannel" : 0
},
"pureBlue" :
{
"redChannel" : 0,
"greenChannel" : 0,
"blueChannel" : 255
}
}
],
```
This time, **we must not change the redChannel of pureRed, greenChannel of pureGreen and blueChannel of pureBlue** or we will lose all the whitelevel configuration.
We should use first the RED, GREEN and BLUE patterns to get the same RED, GREEN and BLUE on led strips and TV. In my case, red and blue were right but I had to add a bit of red at pureGreen (about 25).
At this point, we will have the led strip almost calibrated. Just to be sure, check again whitelevel, gamma correction and all color patterns until you are satisfied with the result.
####Step 4. Color transform (optional)
You can perform some color transformations by increasing the luminance (the amount of "global white") and saturation (the amount of "global color"). Also, you can set the color channel threshold. By setting a threshold what you are doing is deleting the color info of the lowest color values. So, if you set a threshold of 0.1000 on red channel, every red channel value between 0 and 25 (255*0.1) will be zeroed.
You can set the configuration values by modifying this part of the config file:
```
"transform" :
[
{
"id" : "default",
"leds" : "*",
"hsl" :
{
"saturationGain" : 1.0000,
"luminanceGain" : 1.0000
},
"red" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
},
"green" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
},
"blue" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
}
}
],
```
####Step 5. Color temperature (optional)
As a last step you can modify color temperature of the led strip. This involves changing the perception of all the colors, by "warming" them or "colding" them. You can find a lot of information and RGB values of temperature here:
[Color temperature](http://planetpixelemporium.com/tutorialpages/light.html)
You can set the temperature configuration values by modifying this part of the config file:
```
"temperature" :
[
{
"id" : "default",
"leds" : "*",
"temperatureValues" :
{
"red" : 255,
"green" : 255,
"blue" : 255
}
}
],
```

@ -1,51 +0,0 @@
Hyperion comes with a simple command line utility, _hyperion-remote_, to send command to the Hyperion server using the Json interface.
<h4>Setting the leds</h4>
The leds can be set using the color or image command. The color command will set all leds to the same color and the image command will read an image file and set all leds according to this image. Both commands can optionally be given a priority and/or a duration. When no duration is given, a clear command is needed to switch the leds off again.
<h4>Clearing the leds</h4>
A priority channel can be cleared using the two clear command: clear and clearall. Clear will only clear the priority channel provided by the priority parameter or use the default when the parameter is not provided. Clearall on the other hand will clear all active priority channels and effectively set all leds to black.
<h4>Color transformations</h4>
Color transformation can be applied to adjust the values written to the led device. The following transformations are supported (All transformations are executed in the order of the list below):
* HSV color transform
* Saturation: apply gain factor
* Value: apply gain factor
* Transform for each color component (red, green, and blue)
* Threshold: all values below the threshold will be zeroed
* Gamma: apply a gamma curve
* Blacklevel/whitelevel: Scale the output value from [0,1] to [blacklevel,whitelevel]
Note: changes to the color transformations are not written to the configuration file of Hyperion at this moment. Any changes made to the color transformations using the Json interface will be lost after a restart of Hyperion. Nevertheless, setting the color transformations using the command line utility provides an easy and fast way to find a good configuration.
<h4>Json interface</h4>
The Json interface provided by the server is a simple text base interface where messages are newline separated. The format of each message can simply be seen by running the _hyperion-remote_ with the --print options to display the messages which are exchanged between the client and the server.
<h4>Usage</h4>
```Shell
Simple application to send a command to hyperion using the Json interface
Build time: Dec 9 2013 19:51:54
Usage: hyperion-remote [OPTIONS]
Parameters:
-a, --address <arg> Set the address of the hyperion server [default: localhost:19444]
-p, --priority <arg> Use to the provided priority channel (the lower the number, the higher the priority) [default: 100]
-d, --duration <arg> Specify how long the leds should be switched on in millseconds [default: infinity]
-c, --color <arg> Set all leds to a constant color (either RRGGBB hex value or a color name. The color may be repeated multiple time like: RRGGBBRRGGBB)
-i, --image <arg> Set the leds to the colors according to the given image file
-e, --effect <arg> Enable the effect with the given name
--effectArgs <arg> Arguments to use in combination with the specified effect. Should be a Json object string.
-l, --list List server info
-x, --clear Clear data for the priority channel provided by the -p option
--clearall Clear data for all active priority channels
-q, --qualifier <arg> Identifier(qualifier) of the transform to set
-s, --saturation <arg> Set the HSV saturation gain of the leds
-v, --value <arg> Set the HSV value gain of the leds
-g, --gamma <arg> Set the gamma of the leds (requires 3 space seperated values)
-t, --threshold <arg> Set the threshold of the leds (requires 3 space seperated values between 0.0 and 1.0)
-b, --blacklevel <arg> Set the blacklevel of the leds (requires 3 space seperated values which are normally between 0.0 and 1.0)
-w, --whitelevel <arg> Set the whitelevel of the leds (requires 3 space seperated values which are normally between 0.0 and 1.0)
--print Print the json input and output messages on stdout
-h, --help Show this help message and exit
```

@ -1,212 +0,0 @@
This is partly a placeholder whilst we formally document all of the configuration options.
I have grabbed all the config options I could find from the source so we can document them
#General Configuration
###XBMC/Kodi integration
+ xbmcAddress
+ xbmcTcpPort
+ grabVideo
+ grabPictures
+ grabAudio
+ grabMenu
+ grabScreensaver
+ enable3DDetection
###bootsequence
+ effect
+ duration_ms
+ priority
+ color
###blackborderConfig
+ borderFrameCnt
+ maxInconsistentCnt
+ blurRemoveCnt
+ mode
+ threshold
###effect engine
+ paths
###Device
+ bgr-output
+ colorOrder
###transformConfig
+ id
+ red
+ green
+ blue
+ hsv
###colorConfig
+ transform
+ gamma
+ blacklevel
+ whitelevel
###hsvConfig
+ saturationGain
+ valueGain
###ledConfig
+ hscan
+ vscan
###hscanConfig
+ minimum
+ maximum
###vscanConfig
+ minimum
+ maximum
###smoothingConfig
+ type
+ time_ms
+ updateFrequency
+ updateDelay
###forwarderConfig
+ json
+ proto
#Grabber Configuration
###framegrabber
+ width
+ height
+ frequency_Hz
+ priority
###grabber-v4l2
+ device
+ input
+ standard
+ pixelFormat
+ width
+ height
+ frameDecimation
+ sizeDecimation
+ redSignalThreshold
+ greenSignalThreshold
+ blueSignalThreshold
+ priority
+ mode
+ cropLeft
+ cropRight
+ cropTop
+ cropBottom
###amlgrabber
+ width
+ height
+ frequency_Hz
+ priority
###framebuffergrabber
+ device
+ width
+ height
+ frequency_Hz
+ priority
###osxgrabber
+ display
+ width
+ height
+ frequency_Hz
+ priority
#Device Specific Configuration
###adalight, adalightapa102, ambiled
+ output
+ rate
+ delayAfterConnect
###lpd6803,ldp6803,lpd8806,ldp8806,p9813,apa102,sedu
+ output
+ rate
###ws2801,lightberry
+ output - SPI device to write to
+ rate - bit rate of SPI clock
+ latchtime - how long to pause after writing 1 full update
###tinkerforge
+ output
+ port
+ uid
+ rate
###rawhid
+ delayAfterConnect
+ VID
+ PID
###lightpack
+ output
###paintpack
+ delayAfterConnect
+ VID
+ PID
###piblaster
+ output
+ assignment
###multi-lightpack,multi_lightpack
+ none
###hyperion-usbasp-ws2801,hyperion-usbasp-ws2812
+ none
###philipshue
+ output
+ username
+ switchOffOnBlack
+ transitiontime
+ lightIds
###file
+ output - path to the text file which will have led data written to. default is /dev/null
###test (renamed to "file" in recent builds)
+ output - path to the text file which will have led data written to
###fadecandy
+ output
+ port
+ channel
###udp
+ output - the target IP address or hostname
+ rate - the max bits per second to send (unimplemented)
+ protocol - 3 different protocols are supported (0,1,2). details coming soon
+ maxpacket - specifies the maximum UDP packet size
###tpm2
+ output
+ rate
###atmo
+ output
###ws2812b
+ none
###ws281x
+ gpio - which GPIO pin the strip is attached to. defaults to 18
+ leds - maximum number of leds this driver supports - defaults to 256
+ freq - some older LEDs only supported 400kHZ signalling
+ dmanum - which DMA channel to use. be very careful you dont stomp on an already allocated dma channel
+ invert - if != 0, inverts the signal on the GPIO to support an inverting level shifter
###AtmoOrb
+ output
+ transitiontime
+ port
+ numLeds
+ orbIds
+ switchOffOnBlack

@ -1,350 +0,0 @@
The Hyperion daemon uses a JSON based configuration file. Hyperion uses a library for parsing JSON, this library allows the use of C-style comments.
<h4>HyperCon, config builder</h4>
Hyperion comes with a tool, _HyperCon_, for easy building of configuration files.
The tool simplifies the process of defining a correct basic configuration file. Fine tuning of device and setup specific configuration may be completed by 'hand', but this is not necessary as the tool remembers the last used settings. The configuration can therefor be easily tuned and re-generated without the need to redefine the entire configuration.
On the left-side of the application-window the configuration of the led's around the TV can be configured. On the right-side an example is rendered of the TV setup. The image used can be selected by clicking on the TV with the right-mouse button.
Application components can be disabled by completely removing their configuration block or by commenting them entirely.
[Get the latest HyperCon.jar](https://raw.github.com/tvdzwan/hypercon/master/deploy/HyperCon.jar)
```bash
# Start HyperCon on linux
java -jar ./HyperCon.jar
```
![Main screen](hypercon_mainscreen_01.jpg)
### Device settings
The first settings are to specify the device type and parameters related to the device type. Depending on the select 'type' different settings are applicable.
### Frame settings
Settings to specify the led layout:
* Direction: the direction in which the led are layout.
* Led in top corner: true if you have a led in the top corners.
* Led in bottom corner: true if you have a led in the bottom corners.
* Horizontal #: The number of leds you have horizontally on the top and bottom. This excludes any corner leds. If you have less leds on the bottom then take note of the bottom gap setting.
* Vertical #: The number of leds you have vertically on the sides. This excludes any corner leds.
* bottom gap #: The number of leds missing in the bottom row. The amount of leds you specify here are taken from the middle of the bottom row with leds.
* 1st LED offset: This specifies where you start counting the leds. The offset is an offset from the led on the top left.
### Image processing
Settings to specify the integration area of the leds:
* horizontal depth: The percentage of the screen height which is used for determining the color of the leds on the top and the bottom. For example 5% means that the top 5% and the bottom 5% is used.
* vertical depth: The percentage of the screen width which is used for determining the color of the leds on the sides.
* horizontal gap: The percentage of the screen height which is skipped for the top and the bottom leds before the integration area begins.
* vertical gap: The percentage of the screen width which is skipped for the side leds before the integration area begins.
* overlap: The overlap between integration areas. For example 100% overlap means that a led its entire integration area with the neighboring leds (Half with each neighbor)
### Color transform
Settings for transforming pure 'RGB' values to colors on the leds. It is possible to specify multiple 'transformss'. Each transform is applicable for a range of leds. Each led should be mapped to exactly one tranform. The transforms contain the following items:
* id: An unique identifier for this transform.
* leds: A comma seperated list of led-indices (zero based) to which this transform applies. The setting also allows ranges of indices (eg '5-9').
* hsv: Transform specification in the Hue-Saturation-Value domain. The config-object contains two values: 'saturationGain' and 'valueGain'.
* red/green/blue: For each of the RGB color channels a transform is specified. The transform contains four configurable parameters: 'threshold', 'gamma', 'blacklevel', 'whitelevel'.
####What the settings do
For reference i created some Images and try to explain what the settings do to the image.
You will always see the originalimage, then an image with the changes applied to all channels and then an image with the changes applied to only the green channel.
If you increase the **hsv value gain**, the whole image gets brighter and vice versa. In this example the gain is increased:
![original Image](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/orig.png)
![hsv value increased](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/hsvsvaluegain.png)
If you increase **the hsv saturation gain**, all colours get more intense:
![original Image](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/orig.png)
![hsv saturaion gain](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/hsvsaturaiongain.png)
If you set a **threshold**, all color values that are below that value are set to black, like the shadows in the image.
![original Image](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/orig.png)
![threshold all channels](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/allchannel/threshold.png)
![threshold green channel](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/greenchannel/threshold.png)
**Gamma** only affect the the middle tones. Not the brightest and not the darkest. A higher gamma value will darken the middle tones. For reference see [this Wikipedia article](http://en.wikipedia.org/wiki/Gamma_correction). In the example, the sky is as bright as before and the shadows are almost as dark as before, only the middle tones are darker.
The example image has a higher gamma value:
![original Image](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/orig.png)
![gamma all channels](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/allchannel/gamma.png)
![gamma green channel](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/greenchannel/gamma.png)
**Blacklevel** sets the lowest possible black value. So if it is increased, black values will appear grey, like the shadows in the image.
![original Image](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/orig.png)
![blacklevel all channels](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/allchannel/blacklevel.png)
![blacklevel green channel](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/greenchannel/blacklevel.png)
**Whitelevel** sets the highest possible white value. If it is decreased, white values appear grey, like the sky in the image.
![original Image](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/orig.png)
![whitelevel all channels](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/allchannel/whitelevel.png)
![whitelevel green channel](https://raw.githubusercontent.com/Fabi1080/hyperion/master/wiki_Images/greenchannel/whitelevel.png)
<h4>Example configuration file</h4>
The following part shows an example of a configuration similar to the ones created by HyperCon. For convenience not all led's are included.
```javascript
// 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" : "0-49",
"hsv" :
{
"saturationGain" : 1.0000,
"valueGain" : 1.0000
},
"red" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
},
"green" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
},
"blue" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
}
}
],
"smoothing" :
{
"type" : "none",
"time_ms" : 200,
"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.4375, "maximum" : 0.5000 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
{
"index" : 1,
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
{
"index" : 2,
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
{
"index" : 3,
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
{
"index" : 4,
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
:
:
{
"index" : 47,
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
{
"index" : 48,
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
},
{
"index" : 49,
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
"vscan" : { "minimum" : 0.9200, "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
"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" : 64,
"height" : 64,
"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
"xbmcVideoChecker" :
{
"xbmcAddress" : "127.0.0.1",
"xbmcTcpPort" : 9090,
"grabVideo" : true,
"grabPictures" : true,
"grabAudio" : true,
"grabMenu" : false,
"grabScreensaver" : true,
"enable3DDetection" : true
},
/// Configuration for the embedded V4L2 grabber
/// * device : V4L2 Device to use [default="/dev/video0"]
/// * input : V4L2 input to use [default=0]
/// * standard : Video standard (no-change/PAL/NTSC) [default="no-change"]
/// * width : V4L2 width to set [default=-1]
/// * height : V4L2 height to set [default=-1]
/// * frameDecimation : Frame decimation factor [default=2]
/// * sizeDecimation : Size decimation factor [default=8]
/// * priority : Hyperion priority channel [default=800]
/// * mode : 3D mode to use 2D/3DSBS/3DTAB (note: no autodetection) [default="2D"]
/// * cropLeft : Cropping from the left [default=0]
/// * cropRight : Cropping from the right [default=0]
/// * cropTop : Cropping from the top [default=0]
/// * cropBottom : Cropping from the bottom [default=0]
/// * redSignalThreshold : Signal threshold for the red channel between 0.0 and 1.0 [default=0.0]
/// * greenSignalThreshold : Signal threshold for the green channel between 0.0 and 1.0 [default=0.0]
/// * blueSignalThreshold : Signal threshold for the blue channel between 0.0 and 1.0 [default=0.0]
// "grabber-v4l2" :
// {
// "device" : "/dev/video0",
// "input" : 0,
// "standard" : "PAL",
// "width" : -1,
// "height" : -1,
// "frameDecimation" : 2,
// "sizeDecimation" : 8,
// "priority" : 800,
// "mode" : "2D",
// "cropLeft" : 10,
// "cropRight" : 10,
// "cropTop" : 1,
// "cropBottom" : 1,
// "redSignalThreshold" : 0.1,
// "greenSignalThreshold" : 0.1,
// "blueSignalThreshold" : 0.1
// },
/// 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"
}
```
<h4>Replacing the default configuration</h4>
After creating your own configuration file you can copy the new configuration file to the Pi and overwrite the default file:
```
sudo cp my_config.json /etc/hyperion.config.json
initctl restart hyperion
```

@ -1,74 +0,0 @@
----
**NOTE** there is a new solution for connecting multiple hyperions together (and use multiple LED devices). see PR [#518](https://github.com/tvdzwan/hyperion/pull/518) and issue [#486](https://github.com/tvdzwan/hyperion/issues/486)
----
While hyperion cannot control multiple devices lets say Philips Hue and a led strip at the same time (which makes us all very sad) it is possible to spawn multiple hyperion daemons each with their own config file controlling different devices which is, if not even more just as awesome!
In this article I'll try to explain how to have multiple hyperion daemons running each controlling their own device. I've tested this with a led strip and philips hue running on the latest version of OSMC and latest version of Hyperion on a Raspberry Pi. Some of the steps written below might be a little different on different linux distributions or hardware, but in general the basics stay the same.
Hyperion grabs its video frames from Kodi on a client server model which luckily gives us the opportunity to have multiple clients (in this case multiple hyperion daemons) grabbing frames from the same Kodi server.
First thing to do is setup Hyperion like you normally would. I in this case set it up to control my led strips on the back of my tv.
Create a configuration file using hypercon and put it in the default place **/etc/hyperion.config.json** now start up hyperion and its controlling the leds like it should, all randy dandy..
Now create a second configuration file for lets say your Philips hue lights and name it something like **hyperion.config2.json**. Upload this again in **/etc** making sure its not overwriting your first config file but has a different name.
Now edit this second configuration file and pay attention to the following sections.
`"jsonServer" :
{
"port" : 19444
},`
`"protoServer" :
{
"port" : 19445
},`
These are servers which hyperion will start but since these ports are already in use by your first hyperion daemon your second hyperion will fail to start with error binding to ports.
The key here is changing these ports to some other port numbers taking in account that these should be available and not in use by some other programs. I simply changed them to 19446 and 19447 as they where free on my install. Maybe its also possible to just disable these servers, but i'm not sure what they are for so for me it made more sence to just give them different port numbers.
Now after changing these port numbers in the configuration file you can give your second hyperion a go. With the first hyperion daemon running and doing its thing start up the second daemon manually by going into your pi either with ssh or local and executing the following command
`sudo /usr/bin/hyperiond /etc/hyperion.config2.json`
As you can see I gave my second configuration file as a command line argument to the daemon so it knows to use this one instead of the default one.
If all went well and your config is correctly setup your second hyperion should be running now giving you all kind of json output and is controlling your philips hue lights.
In case it doesn't work and you sure you changed the port numbers to free ports then there is probably another problem with your config. In this case you can stop the first hyperion daemon and first see if you can get your config running as a single daemon.
Now its all working and your super hyped calling up friends and making videos with your iphone but wait a minute! You don't want to be running this command every time you reboot your Pi right?
Lets create a startup script to finish off with a cherry on top.
Firstly we need to make a small edit in the original startup script of hyperion, otherwise it will conflict with the startup script of our second one.
Open up /etc/init.d/hyperion in your favorite editor (which should be vim) and edit the following line
`NAME=$DAEMON`
and change it to
`NAME="hyperion1"`
Now save it and put it back in place. Now make a copy of this startup script by doing so on your console
`cp /etc/init.d/hyperion /etc/init.d/hyperion2`
Now edit /etc/init.d/hyperion2 in your favorite editor (which is vim now) and change the following lines
`DAEMONOPTS="/etc/hyperion.config.json"` to `DAEMONOPTS="/etc/hyperion.config2.json"`
`NAME="hyperion1"` to `NAME="hyperion2"`
save and back in place.
Now you gotta make a hardlink to tell your linux to start this up on boot. You can do this by running the following command
`ln /etc/rc2.d/S01hyperion2 /etc/init.d/hyperion2`
Now give that Pi a big ol' reboot and watch all your lights magically lid up.

Binary file not shown.

@ -1,6 +0,0 @@
The effect develoment kit are five python modules which help you visualize your effect.
These are located here: https://github.com/Fabi1080/hyperion_effects_dev_kit
With the kit you can write a effect module which could be used by hyperion without any modifications. Also there is a gui to represent the leds and their colorstate. And if that is not enough to satisfy your eyes, you are able to send the colordata of your effect to the hyperion json server and see live what your effect does.
![screenshot](https://raw.githubusercontent.com/Fabi1080/hyperion_effects_dev_kit/master/screenshot.PNG)

@ -1,92 +0,0 @@
This page describes the necessary information needed to develop additional effects for the Hyperion server. Each effect script is defined in the configuration file using a unique name and a set of arguments. The Hyperion server exposes a module _hyperion_ to the embedded Python effect script. The API of the module will be described and and example effect is discussed.
Also have a look at the [effects development kit](https://github.com/tvdzwan/hyperion/wiki/Effect-development-kit).
<h4>Module hyperion</h4>
<h6>Variables</h6>
**args**
Dictionary containing the arguments of the script (equivalent of the Json structure in the configration file)
**ledCount**
The number of leds which are controlled by Hyperion
<h6>Functions</h6>
**abort**()
Returns True if Hyperion requests the effect to stop execution and return.
**setColor**(_red_, _green_, _blue_)
Set the color of all leds to the color specified by the arguments. The provided value should be an integer between 0 and 255
**setColor**(_colorData_)
Set the color of the leds to the colors specified by the data array. _colorData_ should be a bytearray with a length of 3 * _ledCount_ bytes: RGBRGBRGB...RGB
**setImage**(_width_, _height_, _colorData_)
Set the color of the leds according an image. The size of the image is specified by _width_ and _height_ and _colorData_ is a bytearray containing the color data. The array should be 3 * _width_ * _height_ bytes long. Image data is stored row-wise and starts on the top left of the image.
<h4>Effect deployment</h4>
Effects are deployed by placing them in the effect folder together with one or more effect configuration files. Each effect configuration file defines a single effect (name, script, and arguments). Below is a example of such effect configuration file:
```
{
"name" : "Rainbow swirl fast",
"script" : "rainbow-swirl.py",
"args" :
{
"rotation-time" : 3.0,
"brightness" : 1.0,
"reverse" : false
}
}
```
<h4>Color swirl example</h4>
This section discusses a simple effect, the rainbow switl, as an example. First we need to import any required modules.
```python
import hyperion
import time
import colorsys
```
The module hyperion contains the exposed Hyperion interface, time is required for the necessary sleep function, and colorsys provides a function to convert HSV colors to RGB. Next step is to get the the script arguments from the args variable and add default values for unset items. To avoid problems when arguments are set to a value which is outside the required range, the arguments are corrected.
```python
# Get the parameters
rotationTime = hyperion.args.get('rotation-time', 3.0)
brightness = hyperion.args.get('brightness', 1.0)
saturation = hyperion.args.get('saturation', 1.0)
reverse = hyperion.args.get('reverse', False)
# Check parameters
rotationTime = max(0.1, rotationTime)
brightness = max(0.0, min(brightness, 1.0))
saturation = max(0.0, min(saturation, 1.0))
```
For this effect we build an array which is rotated arouns all leds in a specified time. Now it is time to initialize the bytearray with color data.
```python
# Initialize the led data
ledData = bytearray()
for i in range(hyperion.ledCount):
hue = float(i)/hyperion.ledCount
rgb = colorsys.hsv_to_rgb(hue, saturation, brightness)
ledData += bytearray((int(255*rgb[0]), int(255*rgb[1]), int(255*rgb[2])))
```
We want the calculated led data to make a full rotation in the specifed time. Therefor, the required sleep time is calculated. We make this full rotation in _ledCount_ steps. When the update rate of the leds is too high (we don't want to overload the system when running an effect), we take bigger steps.
```python
# Calculate the sleep time and rotation increment
increment = 3
sleepTime = rotationTime / hyperion.ledCount
while sleepTime < 0.05:
increment *= 2
sleepTime *= 2
increment %= hyperion.ledCount
# Switch direction if needed
if reverse:
increment = -increment
```
Now we have all information and we can start the run loop. It is important to stop when Hyperion asks the effect to quit and therefor we call the _abort_ function. It is also important to sleep in each iteration, otherwise the CPU will spend all of its processing power on executing the effect. For this effect we set the new colors and prepare new colors by moving some data from the back to the start of the bytearray.
```python
# Start the write data loop
while not hyperion.abort():
hyperion.setColor(ledData)
ledData = ledData[-increment:] + ledData[:-increment]
time.sleep(sleepTime)
```
And this is already the entire script. Check out the other effects for more inspiration.

@ -1,4 +0,0 @@
Developers can use the following libraries to control Hyperion.
#### node.js
[hyperion-client](https://github.com/WeeJeWel/node-hyperion-client)

@ -1,32 +0,0 @@
### 1 I have color differences between first and last LED
Make sure you connected at the end of your strip the voltage (5V and GND) again with a (prefered) direct wire between power supply and led strip. We recommend to use a 1mm² cross section to prevent voltage drop under (100% brightness) white.
### 1. I use an external grabber (hdmi splitter/hdmi2av converter) and my leds do strange things?
Before you open an issue, please check if it is working with the internal grabber
-> Use OSMC/OpenELEC, install hyperion and start a movie and check if the internal grabbing behaves the same!
Your hardware may be the fault
### 2. My LEDs start to light up, even when Hyperion is shutdown?
We are not sure about the exact circumstances but the DATA wire collect signals maybe out of the air or through the shutdown pi. It is not possible to prevent that.
Please make sure that you cut the power to your LEDs too, if you don´t use it!
### 3. All colors are shifted (more/or less)
Your HyperCon setting "1st LED offset" is not setting up properly, make sure LED zero is at the position where you input your DATA signals into the strip
### 4. My colors are not shifted, but "red" seams to be "green" when i send "red" (or another/more combination(s)!)
Your "RGB Byte Order" in HyperCon is not setting up properly, check with a R/G/B color which one(s) is(are) wrong and change your RGB order accordingly -> if you don´t understand what we mean just try out all settings and restart hyperion after each try.
### 5. My RGB Byte Order is right but after checking 3 too, my colors are still shifted!
Your "Direction" in HyperCon was not set properly, check that the direction of the TV simulation corresponds with your own construction at your TV. FRONT VIEW!
### 6. Kodi settings won´t work / Kodi Connection ERROR
You have to configure your Kodi the right way - make sure the remote settings are enabled!
In Kodi navigate ->System->Services->Remote control
enable "Allow remote control by programs on this system"
and "Allow remote control by programs on other systems" (you need both, even on the same system)
### 7. Kodi Check: Is it possible to connect to another Kodi at the same network to get the play state?
Yes, you could use your Kodi on Windows/MAC/Linux and another Pi too. Make sure the remote options are enabled
### 8. Kodi Addon: I use the official Kodi addon on an Android box/system but it won´t work or flicker!
Disbale the hardware acceleration, it is not possible to include it! Please don´t ask!

@ -1,48 +0,0 @@
There are numerous possibilities for connecting a string of LEDs to the Raspberry Pi. What the best connection is depends on type of hardware.
Hyperion supports the following connections:
- SPI: Used to directly connect Lightberry, LPD6803, LPD8806, APA102, and WS2801 strips.
- USB: Used for AdaLight, Lightpack, Paintpack, and SEDU
- GPIO: Used to connect with Pi-Blaster
- [UART: Used to directly connect WS2812b (The setup turned out to be unstable)]
- [WS2812b](WS2812b-PWM): Used to directly connect WS2812b and compatible led devices
<h4>Serial Peripheral Interface (SPI)</h4>
If you have a Lightberry this should be easy. The led string comes with everything required to confortably connect your leds to your RPi (see [LightBerry](http://lightberry.eu)).
If you only have a string of LPD6803, LPD8806, APA102 or WS2801 leds the easiest way to connect and control them is via the SPI device. The diagram below shows how the led string connects to the GPIO header.
![Connection WS2801 to Pi](hardware_ws2801_connection.png)
*original from [adafruit.com](http://learn.adafruit.com/light-painting-with-raspberry-pi/hardware)*
Note that we prefer a separate power supply for the Pi and the led string in contradiction to what the original Adafruit image shows. The reason for this is that the requested current can vary from near 0.0A (all leds off) to 2.6A (50 leds full white) in a short time. The Raspberry Pi requires a stable input voltage which means that a high quality power supply is needed, or a separate power supply for the Pi and the leds.
<h5>Buffering the data lines?</h5>
Most people connect their led string directly to the GPIO of the Raspberry Pi. This appears to be working for (almost?) all people. According to the [datasheet of the WS2801](http://www.adafruit.com/datasheets/WS2801.pdf) the data lines require 0.8*Vdd (= 4V for 5V led strings) for an input voltage to be considered as a high bit. This means that the 3.3V output of the GPIO is below the specs. Therefore, we decided to insert a line buffer between the GPIO and the led string based on a simple 74HCT series IC (using cascaded NAND (74HCT00), OR (74HCT32), or AND (74HCT08) ports). Note that it is important to use a chip from the HCT version as these are compatible with the 3.3V outputs of the Pi. A similar solution providing the same kind of buffering can be obtained from [HackerspaceShop.com](http://www.hackerspaceshop.com/raspberrypi-ws2801.html) and probably also from other shops. Below is a picture of the schematic and pcb layout we created and some photos of the result (click [here](Eagle_SpiBuffer.zip) to find the Eagle files). We added the option to power the pi using the power supply of the leds by placing an additional fuse, but due to a very bad Chinese power supply we decided to power the Pi and the leds separately and omit the fuse.
![GPIO adapter schematic](adapter-schematic.png)
![GPIO adapter PCB](adapter-pcb.png)
![GPIO adapter](gpio-adapter-1.jpg)
![GPIO adapter](gpio-adapter-2.jpg)
![GPIO adapter](gpio-adapter-3.jpg)
<h4>Universal Serial Bus</h4>
AdaLight, Lightpack, Paintpack, Lightberry (USB version) and SEDU connect through the USB. There are differences in the actual communication protocol. For all connection is straight forward; plug in and "Go Go Go".
<h4>UART</h4>
**DISCLAIMER: THE CURRENT SOLUTION IS NOT YET STABLE AND CONTAINS NOTICABLE GLITCHES**
The solution was found unstable and is therefor discussed on another page (see [Ws2812b](Ws2812b)).
<h4>Ws2812b with PWM</h4>
See [WS2812b PWM](WS2812b-PWM)
<h4>General Purpose IO</h4>
The Raspberry Pi is equipped with several pins that serve as General Purpose IO. By switching them on and off very quickly a PWM (Pulse Width Modulation) can be created. By varying the ratio between the on and off time (aka Duty Cycle) the brightness of connected leds can be controlled. This does not however allow control of the color of the attached leds. To perform the PWM on the RPi Hyperion relies on Pi-Blaster (see [Pi-Blaster](http://marks-space.com/2013/09/23/software-pwm-on-a-raspberry-pi/)).
<h4>Physical mounting</h4>
<h5>Strips</h5>
The easiest 'mounting' is when you bought a flat led strip. These can simply be pasted to your TV with some double sided tape. Some of these strips even come with tape for this purpose. The difficulty with these strips is connecting the corners. This requires some extra soldering.
There are actual corner connectors (or connection cables) available but I have no experience in their use and do not know how well they work. These have the potential to make your live really easy.
<h5>Frame</h5>
Attaching the leds behind the TV can be done in many ways: from simple cardboard frames to solid frames from aluminum profiles. We have chosen to create our frame from tubes for electrical wiring. An advantage of this method is that the leds (not the ones in the corner) can be turned a little to adjust the angle in which they are mounted. A photo showing the result is shown below.
![Led frame](ledframe.jpg)

44
Home.md

@ -1,40 +1,10 @@
[addon_link]: wiki/XBMC-addon-(not-for-RPi)
##Welcome to the Hyperion Project - Wiki
[Introduction](wiki#introduction)
[Command line utility](wiki/command-line-utility)
[Android remote](wiki/android-remote)
[iOS remote](wiki/Hyperion-Remote-for-iOS)
[Web app](wiki/web-app)
[XBMC addon (not for RPi)][addon_link]
[Hardware](wiki/hardware)
[Installation](wiki/installation)
[Configuration](wiki/configuration)
[Color calibration](wiki/Color-Calibration)
[Supported/Working platforms](wiki/Supported-Working-platforms)
[FAQ Frequently Asked Questions (Problems)](wiki/FAQ-Frequently-Asked-(Problems)-Questions)
[Effect development](wiki/effect-development)
[Software architecture](wiki/software-architecture)
[License](wiki/license)
This Wiki is no longer available on Github, we reworked the whole wiki and created a guide for HyperCon!
All this is available in german and english.
<h4>Introduction</h4>
Hyperion is an opensource 'AmbiLight' implementation controlled using the RaspBerry Pi. The main features of Hyperion are:
* Low CPU load. For a led string of 50 leds the CPU usage will typically be below 2% on a non-overclocked Pi.
* Json interface which allows easy integration into scripts.
* A command line utility allows easy testing and configuration of the color transforms (Transformation settings are not preserved over a restart at the moment...).
* Priority channels are not coupled to a specific led data provider which means that a provider can post led data and leave without the need to maintain a connection to Hyperion. This is ideal for a remote application (like our Android app).
* HyperCon. A tool which helps generate a Hyperion configuration file. The tool will also remember your settings from the previous run.
* Android remote control to set a static color.
* XBMC-checker which checks the playing and screensaver status of XBMC and decides whether or not to capture the screen. The checker also detects whether XBMC is playing 3D video content.
* Black border detector.
* A scriptable effect engine.
* Boblight server interface to enable the use of clients written for Boblight.
* Generic software architecture to support new devices and new algorithms easily.
Please visit our new wiki at:
[wiki.hyperion-project.org](https://wiki.hyperion-project.org)
<h6>Led devices</h6>
At this moment multiple types of led devices are supported. Other devices may be added, but we are unable to test those and therefore we need help with this. If you want support for an additional device pleas let us know and maybe we can add the new device with your testing (or even coding) help.
<h6>Boblight?</h6>
Hyperion is not the only 'Ambilight' clone available for the Raspberry Pi. [Boblight](https://code.google.com/p/boblight/) is a well known and much more used alternative. Why choose Hyperion? Hyperion is built with the Raspberry Pi's limited amount of processing power in mind resulting in an implementation which is about **15x** faster. Where Boblight is setup as a client-server, Hyperion is built in a single app. This drops the need to serialize and deserialize all data sent between the video grabber and the led controller. Hyperion has the possibility to enable an interface which accepts data from clients written for Boblight. This makes it easier to switch to Hyperion if other devices for which no Hyperion client exist are still used. Note that all color transformations should be disabled in the Boblight client, because otherwise transformations are applied twice (first by the Boblight client and second by Hyperion). Boblight has a default gamma correction value of 2.2 which needs to be set to 1. Below is an example of how to run boblight-X11 when connecting to Hyperion.
```
DISPLAY=:0.0 /usr/local/bin/boblight-X11 -s 192.168.53.21:19333 -o gamma=1 -x
```
And our new support forum:
[forum.hyperion-project.org](forum.hyperion-project.org)

@ -1,16 +0,0 @@
A remote control for iOS is available from the App Store. This remote control can be used to control your hyperion server with your iPhone. With this app you can set a static color or one of your installed effects! Simply install the app and add your server via ip and port.
For more information check the project page on [chaosspace.de/hyperion-remote](http://chaosspace.de/hyperion-remote)
<h4>Screenshots</h4>
![Color wheel](http://chaosspace.de/gfx/hyperion/Hyperion%20Remote%20-%20Color%20Wheel%20-%20Small.png)
![Effects](http://chaosspace.de/gfx/hyperion/Hyperion%20Remote%20-%20Effects%20-%20Small.png)
![Widget](http://chaosspace.de/gfx/hyperion/Hyperion%20Remote%20-%20Widget%20-%20Small.png)
![Servers](http://chaosspace.de/gfx/hyperion/Hyperion%20Remote%20-%20Servers%20-%20Small.png)
<h4>App Store</h4>
The remote control can be downloaded from the App Store store for free. Pro features (like the widget) can be unlocked by buying the full version.
[Hyperion in the App Store](https://itunes.apple.com/us/app/hyperion-remote/id943635503?l=de&ls=1&mt=8)

@ -1,9 +0,0 @@
Here comes yet another hyperion remote control as a Chrome App and a website for direct usage. The functionality is similar to the andoid app.
It is available on the Chrome Web Store: [hyperion remote control](https://chrome.google.com/webstore/detail/hyperion-remote-control/ohlgoegainndhjejojilnchmkoghjbpd)
Alternatively you can use it directly from your browser on desktop or mobile device. Just open the following page: [http://gamadril.github.io/hyperion-remote](http://gamadril.github.io/hyperion-remote). Make sure to install hyperion version that supports WebSockets, otherwise it won't work.
![screenshot](http://s15.postimg.org/643i3jjpn/hyperion_remote.png)
The app is open source, code is on [github](https://github.com/Gamadril/hyperion-remote)

@ -1,166 +0,0 @@
# Install Hyperion on OSMC
If you use direct connected PWM LEDs (WS281X): Just use the install script with the following command
```
wget -nv -N https://raw.github.com/tvdzwan/hyperion/master/bin/install_hyperion.sh && chmod +x install_hyperion.sh
sudo sh ./install_hyperion.sh WS281X
```
If you use direct connected SPI LEDs (WS2801, APA102, LPDXXXX, ...): Just use the install script with the following command
```
wget -nv -N https://raw.github.com/tvdzwan/hyperion/master/bin/install_hyperion.sh && chmod +x install_hyperion.sh
sudo sh ./install_hyperion.sh
```
If you use USB connected devices (Arduino, ...): Just use the install script with the following command
```
wget -nv -N https://raw.github.com/tvdzwan/hyperion/master/bin/install_hyperion.sh && chmod +x install_hyperion.sh
sudo sh ./install_hyperion.sh USB
```
# Exta buttons on remote to control lights / change static colour
**Note - this will done by install script too, note that it is not possible for users with PWM driven leds and USB connected devies (need root for access) **
**Make OSMC user boot hyperion instead of sudo/root user**
**Basic explaination:**
Hyperion installer doesnt handle OSMC correctly yet so this is a manual must if you want extra button on the remote to control youre ambilight.
Now everytime we boot it automaticly boots as sudo/root user, we dont want that otherwise we cannot use our colourswitch and on/off button button. This is cause the privilleges limitation on the default OSMC user when we let it open automaticly as sudo/root.
**Now we need killall for some scripts im using**
apt-get install psmisc
**Next we change the hyperion.service file in /etc/systemd/system (this wil open hyperion as OSMC user every boot) (below the content of hyperion.service)**
```
[Unit]
Description=Hyperion
[Service]
Type=simple
User=osmc
Group=osmc
UMask=007
ExecStart=/opt/hyperion/bin/hyperiond /etc/hyperion.config.json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
```
**Then we need to start the service in ssh, once**
/opt/hyperion/bin/hyperiond /etc/hyperion.config.json
**Then we create a new symbolic link**
sudo systemctl enable hyperion
**After that we copy the colourswitch.py, off.py and switch.py to /home/osmc/hyperion**
**off.py (one button on my Harmony Remote to kill all lights in the house, including the Hyperion deamon)**
```
import subprocess
pid = subprocess.Popen('pidof hyperiond', shell=True, close_fds=True, stdout=subprocess.PIPE)
try:
if pid.stdout.readlines():
subprocess.Popen('killall hyperiond', shell=True)
else:
subprocess.Popen('killall hyperiond', shell=True)
except Exception, e:
pass
```
**switch.py (to turn ambilights on/off and off/on with single button**
```
import subprocess
pid = subprocess.Popen('pidof hyperiond', shell=True, close_fds=True, stdout=subprocess.PIPE)
try:
if pid.stdout.readlines():
subprocess.Popen('killall hyperiond', shell=True)
else:
subprocess.Popen('/opt/hyperion/bin/hyperiond /etc/hyperion.config.json </dev/null >/dev/null 2>&1 &', shell=True)
except Exception, e:
pass
```
**colourswitch.py (to get different colours while pusing the same button over and over)**
```
Created on Mar 27, 2015
@author: lukas, nobcat
'''
import json
import subprocess
colors = ['purple',
'blue',
'yellow',
]
defaultData = {"color":"purple",
"effect":"night rider"
}
def read_current():
try:
with open('/home/osmc/hyperion/current.json', 'r') as f:
data = json.load(f)
f.close()
if data == '':
return defaultData
else:
return data
except (IOError, ValueError):
return defaultData
def write_current(data):
try:
with open('/home/osmc/hyperion/current.json', 'w') as f:
json.dump(data, f)
f.close()
except IOError:
pass
def parse_current_effect():
pass
def set_current_effect():
pass
def set_color(color):
subprocess.Popen('/opt/hyperion/bin/hyperion-remote --priority 100 --color ' + color, shell=True)
def main():
current_data = read_current()
for i,color in enumerate(colors):
if color == current_data['color']:
if i == len(colors) - 1:
current_data['color'] = colors[0]
break
else:
current_data['color'] = colors[i + 1]
break
write_current(current_data)
set_color(current_data['color'])
main()
```
**Last we define the buttons in remote.xml**
```
<yellow>RunScript("/home/osmc/hyperion/colourswitch.py")</yellow>
<blue>RunScript("/home/osmc/hyperion/switch.py")</blue>
<red>RunScript("/home/osmc/hyperion/off.py")</red>
```
**And put remote.xml on /home/osmc/.kodi/userdata/keymaps**
###### Done!

@ -1,41 +0,0 @@
Installation on OpenELEC is a bit difficult due to the dependencies required by Hyperion. In order to make installation possible, the missing dependencies will be installed separately.
<h4>Deployment</h4>
The installation of hyperion consists of several steps:
1. installation of the hyperiond and hyperion-remote (default installed to '/storage/hyperion/bin').
2. configuration file for the hyperion daemon (default file '/storage/.config/hyperion.config.json').
3. add hyperiond as a startup service (Startup line is added to '/storage/.config/autostart.sh').
All these steps are wrapped into a single installation script available from the github repository (bin/install_hyperion.sh). This will download and perform the above mentioned steps.
If you use PWM LEDs (WS281X): Just use the install script with the following command
```
curl -L --output install_hyperion.sh --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/bin/install_hyperion.sh
sh ./install_hyperion.sh WS281X
```
If you use SPI LEDs (WS2801, APA102, LPDXXXX, ...: Just use the install script with the following command
```
curl -L --output install_hyperion.sh --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/bin/install_hyperion.sh
sh ./install_hyperion.sh
```
Note that the installed configuration file may need some changes dependent on your hardware setup. See the [configuration page](configuration) for more information. When you create a configuration file for your setup **be sure to update the path to the effects to '/storage/hyperion/effects'** as this path defaults to the normal installation location on other platforms.
After updating the config file, restart the RPi to enable Hyperion.
<h4>Usage</h4>
Using Hyperion is is the same as on other distributions with a small but important exception. The Hyperion executables can not be used directly, because they are not available on the path. Instead two scripts are available (/storage/hyperion/bin/hyperiond.sh and /storage/hyperion/bin/hyperion-remote.sh) which set the the path of the dependencies prior to execution.
You can restart Hyperion with these commands:
```
killall hyperiond
/storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json </dev/null >/dev/null 2>&1 &
```
<h4>Test installation</h4>
Test the installation by checking if data can be send to Hyperion. The usage is a bit different because you need to start the .sh file instead of just typing "hyperion-remote". For example try setting all leds to red for 5 seconds. You can also check if the effect path is correct:
```
/storage/hyperion/bin/hyperion-remote.sh --priority 50 --color red --duration 5000
/storage/hyperion/bin/hyperion-remote.sh --effect "Rainbow swirl fast" --duration 3000
```

@ -1,109 +0,0 @@
For installation on OpenELEC see [here](Installation-on-OpenELEC).
For installation on OSMC see [here](Installation-on-OSMC).
<h4>Prerequisites</h4>
Hyperion make use of some external libraries.
* The [QT libraries](http://qt-project.org) are used as a basis for the application.
* The libusb libraries are needed for certain devices.
* Default set of CA-certificates to allow download from github.
All of these would be installed through the installation script.
In almost all cases is it important, before running the install, to make sure 'boblight' is disabled. Hyperion and boblight most likely use the same device which leads to a conflict if both are on. Boblight can be disabled in the Raspbmc settings menu.
To temporarily disable boblight run (boblight will restart on reboot):
```
sudo /sbin/initctl stop boblight
```
<h4>Deployment</h4>
The installation of hyperion consists of several steps:
1. installation of the hyperiond and hyperion-remote (default installed to '/usr/bin')
2. configuration file for the hyperion daemon (default file '/etc/hyperion.config.json')
3. add hyperiond as a os-service
+ on initctl: "hyperion.conf" in '/etc/init'
+ on init.d: "hyperion" in '/etc/init.d'
+ on systemd: "hyperion.service" in '/etc/systemd/system'
4. start the hyperion service
+ on initctl: 'initctl start hyperion'
+ on init.d: 'service hyperion start'
+ on systemd: 'service hyperion start'
5. Raspbery Pi only: add "dtparam=spi=on" to your config.txt (reboot required)
All these steps are wrapped into a single installation script available from the github repository (bin/install_hyperion.sh). This will download and perform the above mentioned steps.
Note: You need root privileges to install hyperion.
If you use PWM LEDs (WS281X): Just use the install script with the following command
```
wget -nv -N https://raw.github.com/tvdzwan/hyperion/master/bin/install_hyperion.sh && chmod +x install_hyperion.sh
sudo sh ./install_hyperion.sh WS281X
```
If you use SPI LEDs (WS2801, APA102, LPDXXXX, ...: Just use the install script with the following command
```
wget -nv -N https://raw.github.com/tvdzwan/hyperion/master/bin/install_hyperion.sh && chmod +x install_hyperion.sh
sudo sh ./install_hyperion.sh
```
Note that the installed configuration file may need some changes dependent on your hardware setup. See the [configuration page](configuration) for more information.
<h4>Test installation</h4>
Test the installation by checking if data can be send to Hyperion. For example try setting all leds to red for 5 seconds:
```
hyperion-remote --priority 50 --color red --duration 5000
```
<h4>Restart Hyperion</h4>
If you want to change the hyperion config for example you can use the following command. `restart` is also a valid option.
```
# Raspbian(wheezy/jessie)/OSMC users
sudo service hyperion stop
sudo service hyperion start
# Raspbmc/Xbian users
sudo /sbin/initctl stop hyperion
sudo /sbin/initctl start hyperion
# Test hyperion
hyperion-remote --effect "Rainbow swirl fast" --duration 3000
```
<h4>Disable Hyperion</h4>
The system depending scripts will start Hyperion on each boot. If you want to disable Hyperion or switch back to Boblight simply stop Hyperion and delete the script:
On OpenELEC
```
killall hyperiond
sed -i "/hyperiond/d" /storage/.config/autostart.sh
```
On Raspbian Wheezy/Debian 7 and other init.d driven systems
```
sudo /usr/sbin/service hyperion stop
sudo update-rc.d -f hyperion remove
sudo rm -v /etc/init.d/hyperion
```
On Xbian/Ubuntu 14.04 and other initctl driven systems
```
sudo /sbin/initctl stop hyperion
rm /etc/init/hyperion.conf
initctl reload-configuration
```
On Raspbian Jessie/OSMC/Debian 8 and other systemd driven systems
```
sudo service hyperion stop
sudo systemctl disable hyperion.service
rm -v /etc/systemd/system/hyperion.service
```
<h4>Remove Hyperion</h4>
It is possible to remove Hyperion completely from your system. Just use the remove_hyperion.sh (Backup you config if necessary!)
Use the following command
```
wget -nv -N https://raw.github.com/tvdzwan/hyperion/master/bin/remove_hyperion.sh && chmod +x remove_hyperion.sh && sudo sh ./remove_hyperion.sh
```
For OpenELEC and other systems that can´t use "wget"
```
curl -# -k -L --output remove_hyperion.sh --get https://raw.github.com/tvdzwan/hyperion/master/bin/remove_hyperion.sh && sudo sh ./remove_hyperion.sh
```

@ -1,153 +0,0 @@
Below is an example class which can be used to communicate with Hyperion over the proto interface.
This code depends on the protobuf library and the [protobuf interface definition file](https://github.com/tvdzwan/hyperion/blob/master/libsrc/protoserver/message.proto). The definition file needs to be compiled by protoc. When using Eclipse, [this plugin](http://marketplace.eclipse.org/content/protobuf-dt) may be very helpfull (after installation set path to protoc and enable generation of java code on save).
```java
package hyperion;
import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import com.google.protobuf.ByteString;
import proto.Message.ClearRequest;
import proto.Message.ColorRequest;
import proto.Message.HyperionReply;
import proto.Message.HyperionRequest;
import proto.Message.ImageRequest;
public class Hyperion {
private final Socket mSocket;
public Hyperion(String address, int port) throws UnknownHostException, IOException {
mSocket = new Socket(address, port);
}
@Override
protected void finalize() throws Throwable {
if (mSocket != null && mSocket.isConnected()) {
mSocket.close();
}
super.finalize();
}
public void clear(int priority) throws IOException {
ClearRequest clearRequest = ClearRequest.newBuilder()
.setPriority(priority)
.build();
HyperionRequest request = HyperionRequest.newBuilder()
.setCommand(HyperionRequest.Command.CLEAR)
.setExtension(ClearRequest.clearRequest, clearRequest)
.build();
sendRequest(request);
}
public void clearall() throws IOException {
HyperionRequest request = HyperionRequest.newBuilder()
.setCommand(HyperionRequest.Command.CLEARALL)
.build();
sendRequest(request);
}
public void setColor(Color color, int priority) throws IOException {
setColor(color, priority, -1);
}
public void setColor(Color color, int priority, int duration_ms) throws IOException {
ColorRequest colorRequest = ColorRequest.newBuilder()
.setRgbColor(color.getRGB())
.setPriority(priority)
.setDuration(duration_ms)
.build();
HyperionRequest request = HyperionRequest.newBuilder()
.setCommand(HyperionRequest.Command.COLOR)
.setExtension(ColorRequest.colorRequest, colorRequest)
.build();
sendRequest(request);
}
public void setImage(byte[] data, int width, int height, int priority) throws IOException {
setImage(data, width, height, priority, -1);
}
public void setImage(byte[] data, int width, int height, int priority, int duration_ms) throws IOException {
ImageRequest imageRequest = ImageRequest.newBuilder()
.setImagedata(ByteString.copyFrom(data))
.setImagewidth(width)
.setImageheight(height)
.setPriority(priority)
.setDuration(duration_ms)
.build();
HyperionRequest request = HyperionRequest.newBuilder()
.setCommand(HyperionRequest.Command.IMAGE)
.setExtension(ImageRequest.imageRequest, imageRequest)
.build();
sendRequest(request);
}
private void sendRequest(HyperionRequest request) throws IOException {
int size = request.getSerializedSize();
// create the header
byte[] header = new byte[4];
header[0] = (byte)((size >> 24) & 0xFF);
header[1] = (byte)((size >> 16) & 0xFF);
header[2] = (byte)((size >> 8) & 0xFF);
header[3] = (byte)((size ) & 0xFF);
// write the data to the socket
OutputStream output = mSocket.getOutputStream();
output.write(header);
request.writeTo(output);
output.flush();
HyperionReply reply = receiveReply();
if (!reply.getSuccess()) {
System.out.println(reply.toString());
}
}
private HyperionReply receiveReply() throws IOException {
InputStream input = mSocket.getInputStream();
byte[] header = new byte[4];
input.read(header, 0, 4);
int size = (header[0]<<24) | (header[1]<<16) | (header[2]<<8) | (header[3]);
byte[] data = new byte[size];
input.read(data, 0, size);
HyperionReply reply = HyperionReply.parseFrom(data);
return reply;
}
public static void main(String[] args) {
try {
Hyperion hyperion = new Hyperion("192.168.53.21", 19445);
hyperion.setColor(Color.RED, 50);
Thread.sleep(3000);
hyperion.clear(50);
byte[] imageData = {
(byte)0xFF, (byte)0x00, (byte)0x00,
(byte)0xFF, (byte)0xFF, (byte)0x00,
(byte)0x00, (byte)0xFF, (byte)0x00,
(byte)0x00, (byte)0xFF, (byte)0xFF,
(byte)0x00, (byte)0x00, (byte)0xFF};
hyperion.setImage(imageData, 5, 1, 50, 5000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```

@ -1 +0,0 @@
The source is released under MIT-License (see http://opensource.org/licenses/MIT). It is a permissive free software license, meaning that it permits reuse within proprietary software provided all copies of the licensed software include a copy of the MIT License terms.

@ -1,64 +0,0 @@
# Overview
Once you have Hyperion setup and properly configured, it is useful to make the file-system read only. This way you can abruptly shut off the raspberry pi without causing any harm to the SD Card's file-system.
# Steps
### Disable Swap
```
dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable
```
### Install UnionFS
`aptitude install unionfs-fuse`
### Create UnionFS Mount Script
`nano /usr/local/bin/mount_unionfs`
add these lines to the file:
```#!/bin/sh
[ -z "$1" ] && exit 1 || DIR=$1
ROOT_MOUNT=$(grep -v "^#" /etc/fstab | awk '$2=="/" {print substr($4,1,2)}')
if [ "$ROOT_MOUNT" != "ro" ]; then
/bin/mount --bind ${DIR}_org ${DIR}
else
/bin/mount -t tmpfs ramdisk ${DIR}_rw
/usr/bin/unionfs-fuse -o cow,allow_other,suid,dev,nonempty ${DIR}_rw=RW:${DIR}_org=RO ${DIR}
fi
```
Make the file executable:
`chmod +x /usr/local/bin/mount_unionfs`
Update your fstab to look like this:
```
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat ro 0 2
/dev/mmcblk0p2 / ext4 ro,noatime 0 1
mount_unionfs /etc fuse defaults 0 0
mount_unionfs /var fuse defaults 0 0
none /tmp tmpfs defaults 0 0
```
Prepare these directories:
```
cp -al /etc /etc_org
mv /var /var_org
mkdir /etc_rw
mkdir /var /var_rw
reboot
```
Finished!
# End
Now you don't have to worry if your raspberry pi loses power suddenly, all should be well :)
If for some reason you need to make changes you can remount the filesystem as read/write with this command:
`mount -o remount,rw /`
Enjoy
_I give [Max via the pi3g Blog](http://blog.pi3g.com/2014/04/make-raspbian-system-read-only/) credit for this solution_
_BaM provided a better mount_unionfs script in the comments_

@ -1,24 +0,0 @@
I created a [node.js](https://nodejs.org/en/) script ([matrix-config.js](https://raw.githubusercontent.com/RanzQ/hyperion-audio-effects/master/matrix-config.js)) to create LED configurations for matrices. Usage is simple:
```
node matrix-config.js --help
Hyperion matrix configurator by RanzQ
-------------------------------------
options:
-w --width <number> : Matrix width
-h --height <number> : Matrix height
-p --parallel : Parallel rows (not snake)
-s --start [ver]-[hor] : Starting corner, e.g. top-right
-d --debug : Debug print instead of json output
```
So for example if your matrix is 32x8 with the first led at bottom right, you can create led config for it like:
```
node matrix-config.js -w 32 -h 8 -s bottom-right
```
You can print individual led coordinates with option `--debug`. Otherwise it outputs the `leds` part of the hyperion config. You can output it to a file using:
```
node matrix-config.js -w 32 -h 8 -s bottom-right > leds.json
```
I think usually matrices have alternating row directions (snake) so I used is as default. If your matrix has rows going same direction use option `--parallel`.
Update 2016-03-14: I just fixed a bug which caused invalid hscan and vscan values. If someone used this before today, please create your config again. :)

@ -1,94 +0,0 @@
Hyperion now supports a number of options to communicate with LEDs over a network as well as more complex distributed multi-instance deployments
## Control Hyperion using the JSON interface
See [Hyperion-remote](https://github.com/tvdzwan/hyperion/wiki/Command-line-utility) for more details.
You can also open your own TCP connection to drive Hyperion if you want to more efficiently integrate it in existing scripts.
1) use hyperion-remote with --print. This will show you the json command it sends.
In this case, setting the "value" to 0 which is just like turning the brightness down:
```
root@MediaPlayer:~# hyperion-remote --print -v 0
hyperion-remote:
version : master (penfold42-4c00ea2/3fbc03c-1458727954
build time: Mar 23 2016 21:16:58
Connected to localhost:19444
Set color transforms
Command: {"command":"transform","transform":{"valueGain":0.0}}
Reply: {"success":true}
```
You can then open a direct TCP connection to port 19444 and paste this command in:
```
root@MediaPlayer:~# nc localhost 19444
{"command":"transform","transform":{"valueGain":0.0}}
{"success":true}
```
## Simulated LED device
Don't have real LEDs yet ?
Want to test your custom led layout config ?
Develop effects and want to look how your effect performs on differnt layouts (e.g. tv ambilight, matrix, stripe)?
Hypersim can run on another host and displays on screen the LEDs position AND by configuring Hyperion to send led data you can watch it live.
See [hypersim](https://github.com/redPanther/hypersim)
## UDP LED device support
Hyperion supports a UDP based led device type. LED data is simply sent as udp packets to a unicast or multicast address.
Protocol 0 simply sends raw led data in RGBRGB in binary
Protocol 2 uses a basic header to specify the starting led number in case you exceed the MTU
This works great with an ESP8266 based led string receiver like this: https://github.com/penfold42/stuff/blob/master/ESP-udp-neo.ino
### UDP listener "effect"
This listens on the specified UDP port and is compatible with protocol 0 above
## Google ProtoBuffer and JSON message forwarding
Hyperion receives [ProtoBuffer](https://developers.google.com/protocol-buffers/) and JSON messages and has the option to forward those to other Hyperion instances be it local or on a remote network.
So if you want to control multiple Hyperion instances as one for instance via android app or hyperion-remote you can use ProtoBuffer and/or JSON message forwarding.
### Forwarding example #1 - ProtoBuffer and JSON forwarding combined
The below configuration example snippet has 3 Hyperion instances involved where one has this configuration and will forward both ProtoBuffer and JSON messages to 2 other instances.
```
"protoServer" :
{
"port" : 19445
},
....
"jsonServer" :
{
"port" : 19444
},
....
"forwarder" :
{
"proto" : [ "127.0.0.1:20445","192.168.178.88:19445" ],
"json" : [ "127.0.0.1:20444","192.168.178.88:19444" ]
},
```
The main Hyperion instance should have a ProtoBuffer input via Kodi Hyperion addon for instance or be supplied by a standalone live capture grabber (e.g. hyperion-v4l2).
The other two instances of Hyperion are on localhost (127.0.0.1) and the other on a remote host (192.168.178.88) which should have their own configuration.
Multiple destinations are comma separated like in the example above.
### Forwarding example #2 - JSON forwarding only
The below configuration example snippet has 3 Hyperion instances involved where one has this configuration and will forward JSON messages to 2 other instances.
```
"jsonServer" :
{
"port" : 19444
},
....
"forwarder" : {
json : ["127.0.0.1:20444" , "192.168.178.88:19444"]
},
```
The other two instances of Hyperion are on localhost (127.0.0.1) and the other on a remote host (192.168.178.88) which should have their own configuration. Multiple destinations are comma separated like the example above.
### Forwarding troubleshooting
- Please keep an eye on the ports. Avoid using same ports for different Hyperion instances on localhost. Also don't use ports that are used by other services like Hyperion JSON server, Boblight or system services.

@ -1,42 +0,0 @@
[GitHub Resource](https://github.com/emc02/hyp-rpi-oelec-jsonrpc-remote-addon)
This addon is made to control the hyperion ambilight over Network (JSON-RPC) with Browser or Apps
Installation:
- copy the folder "script.hyperioncontrol" to "/storage/.kodi/addons/" on Raspberry Pi
or create a zip file and install Addon from zip file
- copy the folder "scripts" to "userdata/hyperion/scripts/" folder
it contains scripts for hyperion
- activate the json server in Hyperion by uncommenting or adding this lines:
"jsonServer" :
{
"port" : 19444
},
Usage:
call command with JSON-RPC
{"jsonrpc":"2.0","id":1,"method":"Addons.ExecuteAddon" ,"params":{"addonid":"script.hyperioncontrol","params":{"cmd":"power_toggle"}}}
for example: power_toggle calls the script power_toggle.sh
effect_knight_rider calls effect_knight_rider.sh
and so on
there is only one exception, if you call color_FF0000 it will light up the red LEDs
so you can choose all available colors
effect_off turns all effects off ;-)
if you want to use a relay to switch the ambilight power supply please add this lines to autostart.sh:
echo "X" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpioX/direction
echo "1" > /sys/class/gpio/gpioX/value
X is the Number of the GPIO Port used to control the Relay and should be replaced!
in th files power_toggle.sh and power_off.sh the number must be changed too!

@ -1,273 +0,0 @@
Hyperion supports Philips Hue by using the official [RESTful API](http://www.developers.meethue.com/).
# Lights
The lights and their position should be configured using the [HyperCon](https://github.com/tvdzwan/hyperion/wiki/Configuration) tool.
# User account creation
New apps have to be authenticated before control is granted. For this, create a new user account on your bridge as described here:
http://www.developers.meethue.com/documentation/getting-started
The returned username will be put into the device configuration.
# Device configuration
To enable the support, set "type" to "philipshue" and as output the IP adress of your [bridge](https://www.meethue.com/api/nupnp) in the device section of your Hyperion config file:
```json
"device" :
{
"name" : "MyPi",
"type" : "philipshue",
"output" : "192.168.178.33",
"username" : "your-username-goes-here",
"colorOrder" : "rgb",
"switchOffOnBlack" : false,
"lightIds" : [...]
}
```
The default behaviour is to read all available light ids from the bridge.
By supplying an array of integers, this default can be overridden in the case that the order of lights on the bridge does not match the ordering of the lights in the configuration file.
The light ids can be obtained from your bridge under the following url:
`http://ip-of-your-bridge/api/username/lights/`
## Switch lights off on black color
Not all [colors](http://www.developers.meethue.com/documentation/core-concepts) can be displayed by the Philips Hue devices and black will result in a bluish, dark color. Therefore, you can let Hyperion switch off your lights when the light should be black:
```json
"switchOffOnBlack" : true
```
It should be noted, that switching on / off takes more time than a color change due to a fading animation of the device.
# Rate limitation
The performance of the Philips Hue system is limited. The bridge can handle up to 10-30 requests / second.
Due to this limitation, the framegrabber frequency should be set to _10 / number-of-lights Hz_. This is an example for two lights
```json
"framegrabber" :
{
"width" : 64,
"height" : 64,
"frequency_Hz" : 5.0
},
...
```
## Smoothing
Should be turned off since it results in too frequent requests to the bridge.
```json
"smoothing" :
{
"type" : "none",
...
}
```
# Example configuration file
The following part shows a configuration file for two lights positioned left / right of the TV:
```json
// 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" : "philipshue",
"output" : "192.168.178.33",
"colorOrder" : "rgb",
"switchOffOnBlack" : false
},
/// 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" : 1.0000,
"valueGain" : 1.0000
},
"red" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
},
"green" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
},
"blue" :
{
"threshold" : 0.0000,
"gamma" : 1.0000,
"blacklevel" : 0.0000,
"whitelevel" : 1.0000
}
}
],
"smoothing" :
{
"type" : "none",
"time_ms" : 200,
"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.0000, "maximum" : 0.1000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 1.0000 }
},
{
"index" : 1,
"hscan" : { "minimum" : 0.9000, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.0000, "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" : 64,
"height" : 64,
"frequency_Hz" : 5.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" : false,
"grabMenu" : false,
"grabScreensaver" : false,
"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"
}
```
![GETTING STARTED GUIDE](https://cloud.githubusercontent.com/assets/16624176/14308474/07473388-fbf4-11e5-9c58-de2d87bba998.jpg)
![FINE TUNING HYPERCON](https://cloud.githubusercontent.com/assets/16624176/14327378/a46a38b2-fc4f-11e5-9410-4ea356a2c833.jpg)

@ -1,2 +0,0 @@
TODO
![Design diagram](design.png)

@ -1,16 +0,0 @@
## Supported/Working platforms
All listed systems and platforms are known as working
### Hardware
* Raspberry Pi 1/Zero/2/3 (all sub versions)
* 32/64bit (no BSD/Windows)
* iMX6
* Wetek
### Distributions
* OpenELEC 5.X, 6.X
* OSMC (OSMC have problems with PWM LEDs directly connected, please check with another Distro!)
* LibreELEC (Use the installer that is integrated in LibreELEC, we will not include it in our install script)
* Raspbian (Wheezy/Jessie)
* Linux 32/64bit
* Mac OSX (You need to compile you own version of Hyperion)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

@ -1,77 +0,0 @@
V412 Grabber
Hyperion supports the v412 Grabber which is the most common used for grabbing Ambilight signals. This currently does not work with Openelec because it doesnt have the drivers in it. Some users did it on their own. With this built in method **there is no need to struggle around with mplayer!**
Hardware:
=========
You need a grabber with a special chipset. Known, working grabbers are:
mumbi video grabber
Dazzle DVR
Not working grabbers are:
Logilink
Setup
=====
For normal wheezy you need to plug in your grabber, connect a video signal to it and start Hyperion.
First we try to get a Screenshot from the grabber.
```
sudo hyperion-v4l2 --width 320 --height 180 --screenshot
```
The screenshot will be saved in the current directory. **It can have green parts or weird quality.** Thats no problem, try to get a clean picture. Then open the picture in a graphic editor and measure the black blanks around. Note this for every side.
You can test your setup like this:
```
sudo hyperion-v4l2 --width 640 --height 480 --screenshot --frame-decimator 2 --size-decimator 8 --crop-left 26 --crop-right 27 --crop-top 20 --crop-bottom 20
```
To permanently add your Grabber you can do:
```
/// Configuration for the embedded V4L2 grabber
/// * device : V4L2 Device to use [default="/dev/video0"]
/// * input : V4L2 input to use [default=0]
/// * standard : Video standard (no-change/PAL/NTSC) [default="no-change"]
/// * width : V4L2 width to set [default=-1]
/// * height : V4L2 height to set [default=-1]
/// * frameDecimation : Frame decimation factor [default=2]
/// * sizeDecimation : Size decimation factor [default=8]
/// * priority : Hyperion priority channel [default=800]
/// * mode : 3D mode to use 2D/3DSBS/3DTAB (note: no autodetection) [default="2D"]
/// * cropLeft : Cropping from the left [default=0]
/// * cropRight : Cropping from the right [default=0]
/// * cropTop : Cropping from the top [default=0]
/// * cropBottom : Cropping from the bottom [default=0]
/// * redSignalThreshold : Signal threshold for the red channel between 0.0 and 1.0 [default=0.0]
/// * greenSignalThreshold : Signal threshold for the green channel between 0.0 and 1.0 [default=0.0]
/// * blueSignalThreshold : Signal threshold for the blue channel between 0.0 and 1.0 [default=0.0]
"grabber-v4l2" :
{
"device" : "/dev/video0",
"input" : 0,
"standard" : "PAL",
"width" : 640,
"height" : 480,
"frameDecimation" : 2,
"sizeDecimation" : 8,
"priority" : 1000,
"mode" : "2D",
"cropLeft" : 26,
"cropRight" : 27,
"cropTop" : 20,
"cropBottom" : 20,
"redSignalThreshold" : 0.1,
"greenSignalThreshold" : 0.1,
"blueSignalThreshold" : 0.1
},
```
Frame decimation will clean out all green and blury stuff. I dont know exactly how it works, but then every green should be gone. Frame decimation shrinks your grabbed picture to get more fps. These values are default and should suit very well to every grabber.
Some other notes:
=================
Driver info:
```
-v4l2-ctl --all
```
Be sure you remove any "framegrabber" section if you want to use the "grabber-v4l2" othewise you may encounter blinking leds.

@ -1,64 +0,0 @@
The "ws2812b" driver **only** works for the Raspberry Pi 1 (A and B model).
The newly merged "ws281x" driver works for Raspberry Pi 1,2 and 3
### Configuration
You can use the special driver for Ws2812b to run compatible leds.
Config Tool is available:
[HyperCon](https://raw.github.com/tvdzwan/hypercon/master/deploy/HyperCon.jar)
The device-config for the original led device should look like this:
"device" :
{
"name" : "MyPi",
"type" : "ws2812b",
"colorOrder" : "rgb"
},
The device-config for the NEW led device that support RPi 1,2,3 should look like this:
"device" :
{
"name" : "MyPi",
"type" : "ws281x",
"colorOrder" : "grb",
"leds" : 107
},
### Additional device parameters
In addition to "colorOrder" and "leds", the "ws281x" device has the following parameters (listed here with their defaults):
"gpio" : 18,
"dmanum" : 5,
"freq" : 800000,
"pwmchannel" : 0,
The RPi 2 and 3 both have three pins capable of PWM, BCM **18** (default, channel 0), BCM **12** (channel 0) and BCM **13** (channel 1). All three pins have been verified to work with WS2812B LEDs and with the ws281x driver. However, both PWM channels are used by the Pi's on-board analog audio, so you have the problem outlined below no matter which pin you choose.
### Hardware setup
![Raspberry Pi 2 40 Pin Connection to ws2812b](https://cloud.githubusercontent.com/assets/129956/6201128/8d039fb0-b498-11e4-9500-7b68430a2784.png)
![WS2812B.png](WS2812B.png)
Connect the data line of the leds to the pin 12 (GPIO 18) of your raspberry pi, most people put a resistor (R* in the graphic) (100-300 Ohm) between the leds and the pi for less ringing.
This simple wiring isn't guaranteed to work for everyone. The ws2812b specifications state that the logic "high" signal needs to be > 0.7*VCC which is 3.5v. The Pi's GPIO pins will only output 3.3v so this will be close enough for some users, but is not guaranteed. To do it properly, you should use a level shifter on the data line or drop the LED strip's VCC to 4.7V.
### Known problems
These drivers uses the same hardware (PWM channels) as the analog audio out of the RPi, they **can not** work at the same time since the share the same output data line! If you don't direct the audio to the HDMI port or otherwise disable the analog audio, you'll get random nonsense on your LEDs.
For a reason that hasn't been nailed down yet, if you use an OSMC or RetroPie image (straight Jessie and Jessie-Lite don't yet exhibit this behavior), then this driver will only work if the HDMI port is connected when the Pi boots.
If you want to use a ws2812 without tying up a USB port you may want to consider a SPI to ws2812 converter.
Arduino (atmega328) sketch here: https://github.com/penfold42/stuff/blob/master/WS2801_to_2812_josh.ino
### More information
All RPi pin configurations, depending on your version: [Link](http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/)
Pin Configuration of the RPi / RPi2 40 pin header with nice printout: [40 pin 'Hat'](http://www.raspberrypi-spy.co.uk/2014/07/raspberry-pi-b-gpio-header-details-and-pinout/).
[More info](https://github.com/tvdzwan/hyperion/issues/6)

@ -1 +0,0 @@
see https://github.com/tvdzwan/hyperion/wiki/WS2812b-PWM-led-devices

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

@ -1,5 +0,0 @@
For those unfortunate enough to not being able to use the Android app, we have modified the Boblight web app of Nadnerb (http://blog.nadnerb.co.uk/?p=311) to work directly with Hyperion. Hyperion support is limited to setting a static color and selecting effects to run.
The code and install instructions can be found here: https://github.com/poljvd/hyperion-webapp
![Web app screenshot](https://github.com/tvdzwan/hyperion/wiki/webapp_screenshot.png)

@ -1,8 +0,0 @@
_Note: This Hyperion XBMC addon wil not work on the Raspberry Pi! The XBMC video player of the Raspberry Pi is missing the interface used by this addon and therefor will not work. On the Raspberry Pi, Hyperion uses dispmanx from the firmware to make screen captures._
A XBMC addon is available which captures the video output and forwards image data to the Hyperion server. The addon needs to be configured with the address of the Hyperion server before it can work. Besides the basic grabbing of the playing video, no additional fancy features are available. Below are some plugin screenshots.
The addon can be downloaded from [https://github.com/poljvd/script.service.hyperion](https://github.com/poljvd/script.service.hyperion).
![Hyperion addon](addon.jpg)
![Hyperion addon](addon-settings.jpg)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
addon.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 532 KiB