Hello!
Since I’ve been asked how to do this in another topic, here’s a short explanation with necessary Python script attached (it is attached as .txt file, since .py files can’t be attached).
DominantImageColor.txt (1.1 KB)
General idea:
Change the color of RGB light bulb to a dominant color of a Plex poster for currently playing movie/TV show.
Required software and bindings:
- Python 3 (with ColorThief library installed)
- SSH enabled on both, OpenHAB server and Plex server
- Exec Binding
- Plex Binding
- JSONPath Transformation
Python script explanation
Python script has 1 parameter (-i) which takes URL of currently playing Plex item poster as input. After running script, it returns JSON output, containing Hue, Saturation and Brightness of dominant poster color.
OpenHAB part of implementation
After item containing state of Plex player changes to “Playing”, URL of the Plex poster is used as Python script parameter, and the script result is used to change the color bulb item to a dominant poster color. I’m running Python script on the Plex server (Windows machine), since running it on the OpenHAB server (Raspberry Pi 3) was way too slow.
OpenHAB rule
rule "Plex Playing"
when
Item PlexPlayerState changed to "Playing"
then
var PlexPosterURL = ""
var PlexPosterURLEdited = ""
var DominantImageColor = ""
PlexPosterURL = PlexPlayerPosterURL.state.toString
PlexPosterURLEdited = PlexPosterURL.replace(https, http)
if (PlexPosterURLEdited != "") {
DominantImageColor = executeCommandLine(Duration.ofSeconds(90), "ssh", "User@192.168.1.1", "C:\\DominantImageColor\\DominantImageColor.py", "-i", PlexPosterURLEdited)
if ((transform("JSONPATH", "$.hue", DominantImageColor) !== NULL) && (transform("JSONPATH", "$.saturation", DominantImageColor) !== NULL) && (transform("JSONPATH", "$.brightness", DominantImageColor) !== NULL)) {
var DecimalType RGBWColorValueHue = new DecimalType(Float::parseFloat(transform("JSONPATH", "$.hue", DominantImageColor)).intValue)
var PercentType RGBWColorValueSaturation = new PercentType(Float::parseFloat(transform("JSONPATH", "$.saturation", DominantImageColor)).intValue)
var PercentType RGBWColorValueBrightness = new PercentType(Float::parseFloat(transform("JSONPATH", "$.brightness", DominantImageColor)).intValue)
var HSBType RGBWBulbColor = new HSBType(RGBWColorValueHue, RGBWColorValueSaturation, RGBWColorValueBrightness)
LightsBulbRGBWColorMode.sendCommand(ON)
LightsBulbRGBWColorMode.sendCommand(RGBWBulbColor.toString)
LightsBulbRGBWColorMode.sendCommand(100)
}
}
end
I’m using this rule with Shelly Duo RGBW, so, using it with another color bulb might require some changes in this rule and/or Python script.
Best regards,
Davor