{"id":4801,"date":"2022-01-29T15:35:30","date_gmt":"2022-01-29T21:35:30","guid":{"rendered":"https:\/\/areciv.com\/blog\/?p=4801"},"modified":"2022-01-29T15:35:33","modified_gmt":"2022-01-29T21:35:33","slug":"grafana-dashboards-on-roku-screensaver","status":"publish","type":"post","link":"https:\/\/areciv.com\/blog\/2022\/01\/grafana-dashboards-on-roku-screensaver\/","title":{"rendered":"Grafana Dashboards on Roku Screensaver"},"content":{"rendered":"\n<p>Over the past couple years I've set up a bunch of <a href=\"https:\/\/grafana.com\/\">Grafana <\/a>dashboards to help me keep an eye on everything from weather to server stats to how much mail is waiting for me at the post office.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1.jpg\"><img decoding=\"async\" width=\"1024\" height=\"576\" data-attachment-id=\"4822\" data-permalink=\"https:\/\/areciv.com\/blog\/2022\/01\/grafana-dashboards-on-roku-screensaver\/roku-ss-1\/\" data-orig-file=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1.jpg\" data-orig-size=\"1280,720\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screensaver Dashboard Screenshot\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-300x169.jpg\" data-large-file=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-1024x576.jpg\" src=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-1024x576.jpg\" alt=\"\" class=\"wp-image-4822\" srcset=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-1024x576.jpg 1024w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-300x169.jpg 300w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-768x432.jpg 768w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-520x292.jpg 520w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1-720x404.jpg 720w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1.jpg 1280w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Of course if I'm sitting near a computer, it's easy to log in and click through a few of them, but I wanted to keep an eye on things while I was working around the house.<\/p>\n\n\n\n<p>My TVs have long had some flavor of <a href=\"https:\/\/www.roku.com\/\">Roku streaming device<\/a> attached.  I looked into the capabilities of custom channels and they aren't really set up to display a webpage.  However, images and videos are fair game of course.  Turns out there's a plugin for Grafana called <a href=\"https:\/\/grafana.com\/grafana\/plugins\/grafana-image-renderer\/\">Grafana Image Renderer<\/a> that runs on the server and can produce an image of a dashboard.  Perfect!<\/p>\n\n\n\n<p>So to make this all work, I wrote two small programs:<\/p>\n\n\n\n<p>The first is a very simple <a href=\"https:\/\/github.com\/mmdoogie\/roku-imgserver-screensaver-server\">server component<\/a>.  The server part provides a couple of pieces of information when the channel loads so I don't have to try to do configuration of the list of images on the Roku and allows me to update the image list without touching the channel.  It also can pull other images from general webservers, like public price graphs, sky charts, and webcams.  This part also uses <a href=\"https:\/\/imagemagick.org\/index.php\">ImageMagick<\/a> to scale the image from an arbitrary size for correct display.  Yeah, this whole component is probably overkill and could definitely be done many different ways.  This whole thing has evolved quite a bit from how I originally did it, so it's just what's working at the moment for me.<\/p>\n\n\n\n<p>The <a href=\"https:\/\/github.com\/mmdoogie\/roku-imgserver-screensaver\">screensaver<\/a> is also fairly basic but has a little bit more to it &#8212; it gets the number of images and their descriptions from the server, then requests them as a result of navigation.  There are also a few nice UI features: by default, it auto-advances every 5 seconds, so as a screensaver it'll loop through the various images.  If you run it as a channel directly you can interact with it, scrolling to a specific image, seeing a list of the image titles, and auto-refreshing a specific image every 30 seconds.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2..jpg\"><img decoding=\"async\" width=\"1024\" height=\"576\" data-attachment-id=\"4823\" data-permalink=\"https:\/\/areciv.com\/blog\/2022\/01\/grafana-dashboards-on-roku-screensaver\/roku-ss-2\/\" data-orig-file=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2..jpg\" data-orig-size=\"1280,720\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screensaver Image List Screenshot\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-300x169.jpg\" data-large-file=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-1024x576.jpg\" src=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-1024x576.jpg\" alt=\"\" class=\"wp-image-4823\" srcset=\"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-1024x576.jpg 1024w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-300x169.jpg 300w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-768x432.jpg 768w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-520x292.jpg 520w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2.-720x404.jpg 720w, https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-2..jpg 1280w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>If you want to try it out, you can grab both pieces from GitHub.  Instructions for each part are over there as well!<\/p>\n\n\n<div class=\"ebg-br-wrapper\">\n\t<div class=\"ebg-br-cfg-dark-theme-off ebg-br-template-repo\">\n\t\t<div class=\"ebg-br-body ebg-br-border ebg-br-background-color\">\n\t\t\t<i class=\"ebg-br-hide ebg-br-logo fab fa-github\"><\/i>\n\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-logo ebg-br-icon-github ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t<div class=\"ebg-br-col ebg-br-col-sidebar\">\n\t\t\t\t<img decoding=\"async\" class=\"ebg-br-header-avatar\" src=\"https:\/\/avatars.githubusercontent.com\/u\/24367033?v=4\" alt=\"Avatar\" width=\"150\" height=\"150\" \/>\n\t\t\t<\/div>\n\t\t\t<div class=\"ebg-br-col ebg-br-col-main\">\n\t\t\t\t<p class=\"ebg-br-title\">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/mmdoogie\/roku-imgserver-screensaver\">\n\t\t\t\t\t\t\troku-imgserver-screensaver <i class=\"ebg-br-hide fas fa-link\"><\/i><img decoding=\"async\" class=\"ebg-br-cfg-icon-type-source-file ebg-br-img-color-auto\" src=\"https:\/\/areciv.com\/blog\/wp-content\/plugins\/embed-block-for-github\/public\/images\/link.svg\" alt=\"\" height=\"22\" width=\"22\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\">(this link opens in a new window)<\/span>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/strong>\n\t\t\t\t\t<em>\n\t\t\t\t\t\tby<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/mmdoogie\">\n\t\t\t\t\t\t\tmmdoogie <i class=\"ebg-br-hide fas fa-link\"><\/i><img decoding=\"async\" class=\"ebg-br-cfg-icon-type-source-file ebg-br-img-color-auto\" src=\"https:\/\/areciv.com\/blog\/wp-content\/plugins\/embed-block-for-github\/public\/images\/link.svg\" alt=\"\" height=\"9\" width=\"9\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\">(this link opens in a new window)<\/span>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/em>\n\t\t\t\t<\/p>\n\t\t\t\t<p class=\"ebg-br-description \">\n\t\t\t\t\tRoku screensaver that grabs a list of image descriptions from a server, then requests and displays them.  Has auto-advanced, auto-refresh, list of images, etc.\n\t\t\t\t<\/p>\n\t\t\t\t<p class=\"ebg-br-footer\">\n\t\t\t\t\t<span class=\"ebg-br-subscribers\">\n\t\t\t\t\t\t<i class=\"ebg-br-hide ebg-br-icon fas fa-heart\">&nbsp;<\/i>\n\t\t\t\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-icon ebg-br-icon-subscribers ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t\t\t\t2 Subscribers\t\t\t\t\t<\/span>\n\t\t\t\t\t<span class=\"ebg-br-watchers\">\n\t\t\t\t\t\t<i class=\"ebg-br-hide ebg-br-icon fas fa-eye\">&nbsp;<\/i>\n\t\t\t\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-icon ebg-br-icon-watchers ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t\t\t\t4 Watchers\t\t\t\t\t<\/span>\n\t\t\t\t\t<span class=\"ebg-br-forks\">\n\t\t\t\t\t\t<i class=\"ebg-br-hide ebg-br-icon fas fa-code-branch\">&nbsp;<\/i>\n\t\t\t\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-icon ebg-br-icon-forks ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t\t\t\t0 Forks\t\t\t\t\t<\/span>\n\t\t\t\t\t<a target=\"_blank\" rel=\"noopener noreferrer\" class=\"ebg-br-link\" href=\"https:\/\/github.com\/mmdoogie\/roku-imgserver-screensaver\">\n\t\t\t\t\t\tCheck out this repository on GitHub.com <i class=\"ebg-br-hide fas fa-link\"><\/i><img decoding=\"async\" class=\"ebg-br-cfg-icon-type-source-file ebg-br-img-color-auto\" src=\"https:\/\/areciv.com\/blog\/wp-content\/plugins\/embed-block-for-github\/public\/images\/link.svg\" alt=\"\" height=\"11\" width=\"11\">\n\t\t\t\t\t\t<span class=\"screen-reader-text\">(this link opens in a new window)<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/p>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"ebg-br-editmode ebg-br-box-status\">\n\t\t<div class=\"egb-br-cache-status\">\n\t\t\t<div class=\"ebg-br-cfg-cache-off\">\n\t\t\t\t<span class=\"egb-br-status-img-on-off\">Cache<\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t<div class=\"egb-br-dark_theme-status\">\n\t\t\t<div class=\"ebg-br-cfg-dark-theme-off\">\n\t\t\t\t<span class=\"egb-br-status-img-on-off\">Dark Theme<\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n<div class=\"ebg-br-wrapper\">\n\t<div class=\"ebg-br-cfg-dark-theme-off ebg-br-template-repo\">\n\t\t<div class=\"ebg-br-body ebg-br-border ebg-br-background-color\">\n\t\t\t<i class=\"ebg-br-hide ebg-br-logo fab fa-github\"><\/i>\n\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-logo ebg-br-icon-github ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t<div class=\"ebg-br-col ebg-br-col-sidebar\">\n\t\t\t\t<img decoding=\"async\" class=\"ebg-br-header-avatar\" src=\"https:\/\/avatars.githubusercontent.com\/u\/24367033?v=4\" alt=\"Avatar\" width=\"150\" height=\"150\" \/>\n\t\t\t<\/div>\n\t\t\t<div class=\"ebg-br-col ebg-br-col-main\">\n\t\t\t\t<p class=\"ebg-br-title\">\n\t\t\t\t\t<strong>\n\t\t\t\t\t\t<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/mmdoogie\/roku-imgserver-screensaver-server\">\n\t\t\t\t\t\t\troku-imgserver-screensaver-server <i class=\"ebg-br-hide fas fa-link\"><\/i><img decoding=\"async\" class=\"ebg-br-cfg-icon-type-source-file ebg-br-img-color-auto\" src=\"https:\/\/areciv.com\/blog\/wp-content\/plugins\/embed-block-for-github\/public\/images\/link.svg\" alt=\"\" height=\"22\" width=\"22\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\">(this link opens in a new window)<\/span>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/strong>\n\t\t\t\t\t<em>\n\t\t\t\t\t\tby<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/mmdoogie\">\n\t\t\t\t\t\t\tmmdoogie <i class=\"ebg-br-hide fas fa-link\"><\/i><img decoding=\"async\" class=\"ebg-br-cfg-icon-type-source-file ebg-br-img-color-auto\" src=\"https:\/\/areciv.com\/blog\/wp-content\/plugins\/embed-block-for-github\/public\/images\/link.svg\" alt=\"\" height=\"9\" width=\"9\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\">(this link opens in a new window)<\/span>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/em>\n\t\t\t\t<\/p>\n\t\t\t\t<p class=\"ebg-br-description \">\n\t\t\t\t\tServer component to pair with roku-imgserver-screensaver.\n\t\t\t\t<\/p>\n\t\t\t\t<p class=\"ebg-br-footer\">\n\t\t\t\t\t<span class=\"ebg-br-subscribers\">\n\t\t\t\t\t\t<i class=\"ebg-br-hide ebg-br-icon fas fa-heart\">&nbsp;<\/i>\n\t\t\t\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-icon ebg-br-icon-subscribers ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t\t\t\t1 Subscriber\t\t\t\t\t<\/span>\n\t\t\t\t\t<span class=\"ebg-br-watchers\">\n\t\t\t\t\t\t<i class=\"ebg-br-hide ebg-br-icon fas fa-eye\">&nbsp;<\/i>\n\t\t\t\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-icon ebg-br-icon-watchers ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t\t\t\t1 Watcher\t\t\t\t\t<\/span>\n\t\t\t\t\t<span class=\"ebg-br-forks\">\n\t\t\t\t\t\t<i class=\"ebg-br-hide ebg-br-icon fas fa-code-branch\">&nbsp;<\/i>\n\t\t\t\t\t\t<i class=\"ebg-br-cfg-icon-type-source-file ebg-br-icon ebg-br-icon-forks ebg-br-img-color-auto\">&nbsp;<\/i>\n\t\t\t\t\t\t0 Forks\t\t\t\t\t<\/span>\n\t\t\t\t\t<a target=\"_blank\" rel=\"noopener noreferrer\" class=\"ebg-br-link\" href=\"https:\/\/github.com\/mmdoogie\/roku-imgserver-screensaver-server\">\n\t\t\t\t\t\tCheck out this repository on GitHub.com <i class=\"ebg-br-hide fas fa-link\"><\/i><img decoding=\"async\" class=\"ebg-br-cfg-icon-type-source-file ebg-br-img-color-auto\" src=\"https:\/\/areciv.com\/blog\/wp-content\/plugins\/embed-block-for-github\/public\/images\/link.svg\" alt=\"\" height=\"11\" width=\"11\">\n\t\t\t\t\t\t<span class=\"screen-reader-text\">(this link opens in a new window)<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/p>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"ebg-br-editmode ebg-br-box-status\">\n\t\t<div class=\"egb-br-cache-status\">\n\t\t\t<div class=\"ebg-br-cfg-cache-off\">\n\t\t\t\t<span class=\"egb-br-status-img-on-off\">Cache<\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t<div class=\"egb-br-dark_theme-status\">\n\t\t\t<div class=\"ebg-br-cfg-dark-theme-off\">\n\t\t\t\t<span class=\"egb-br-status-img-on-off\">Dark Theme<\/span>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Over the past couple years I've set up a bunch of Grafana dashboards to help me keep an eye on everything from weather to server stats&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":4822,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"New blog post - Displaying my @Grafana dashboards (and other live images) as a @Roku screensaver!","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[88],"tags":[102,103],"class_list":["post-4801","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-grafana","tag-roku"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/areciv.com\/blog\/wp-content\/uploads\/2022\/01\/roku-ss-1.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/posts\/4801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/comments?post=4801"}],"version-history":[{"count":7,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/posts\/4801\/revisions"}],"predecessor-version":[{"id":4872,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/posts\/4801\/revisions\/4872"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/media\/4822"}],"wp:attachment":[{"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/media?parent=4801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/categories?post=4801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/areciv.com\/blog\/wp-json\/wp\/v2\/tags?post=4801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}