{"id":258,"date":"2021-01-05T00:49:07","date_gmt":"2021-01-05T00:49:07","guid":{"rendered":"https:\/\/brucemyers.com\/?p=258"},"modified":"2023-03-10T16:57:50","modified_gmt":"2023-03-10T16:57:50","slug":"raspberry-pi-4-mythtv-ota-dvr","status":"publish","type":"post","link":"https:\/\/brucemyers.com\/?p=258","title":{"rendered":"Raspberry Pi 4 MythTV OTA DVR"},"content":{"rendered":"\n<p>Process for creating a Raspberry Pi 4 Over-the-air (OTA) DVR to watch and record TV shows.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>These instructions were derived from this blog post: <a href=\"https:\/\/mythtv-rp4.blogspot.com\/\">mythtv on Raspberry PI 4<\/a> (external site).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CanaKit Raspberry Pi 4 4GB Starter Kit with Case<\/li>\n\n\n\n<li>Hauppauge WinTV-DualHD Dual USB HD TV Tuner<\/li>\n\n\n\n<li>Samsung T7 Touch Portable SSD 500GB<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123546.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123546.jpg\" alt=\"\" class=\"wp-image-221\" width=\"279\" height=\"196\" srcset=\"https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123546.jpg 1000w, https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123546-300x211.jpg 300w, https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123546-768x541.jpg 768w\" sizes=\"auto, (max-width: 279px) 100vw, 279px\" \/><\/a><figcaption class=\"wp-element-caption\">CanaKit Raspberry Pi 4 kit<\/figcaption><\/figure>\n<\/div>\n\n\n<p><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123754.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123754.jpg\" alt=\"\" class=\"wp-image-220\" width=\"232\" height=\"197\" srcset=\"https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123754.jpg 1000w, https:\/\/brucemyers.com\/wp-content\/uploads\/2021\/01\/20210104_123754-768x657.jpg 768w\" sizes=\"auto, (max-width: 232px) 100vw, 232px\" \/><\/a><figcaption class=\"wp-element-caption\">Hauppauge WinTV-dualHD TV Tuner<\/figcaption><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Software<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Raspberry Pi OS Lite<\/li>\n\n\n\n<li><a href=\"https:\/\/www.mythtv.org\/\">MythTV<\/a> (external site)<\/li>\n\n\n\n<li>Schedules Direct - program guide listings<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Prep Work<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Assemble CanaKit Raspberry Pi 4 kit: includes heat sinks, fan, case, power supply, microSD card with NOOBS bootloader, HDMI Cable<\/li>\n\n\n\n<li>Attach a wired or wireless keyboard and optionally a mouse (SSH can be configured later)<\/li>\n\n\n\n<li>Attach external drive, TV tuner, HDMI cable to TV, optionally Ethernet cable if WiFi not available<\/li>\n\n\n\n<li>Plug the power supply in<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Install Raspberry Pi OS<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install Raspberry Pi OS Lite (32-bit)<\/li>\n\n\n\n<li>sudo raspi-config - config WiFi, autologin, localization, etc\n<ul class=\"wp-block-list\">\n<li>Sony TV required setting -50 overscan in all 4 directions; allow overscan<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>sudo reboot<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Install MythTV<\/h2>\n\n\n\n<p>pi-utils are a set of scripts posted by <a href=\"https:\/\/github.com\/MikeB2013\/pi-utils\">MikeB2013 on GitHub<\/a> (external site).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sudo apt install git<\/li>\n\n\n\n<li>git clone https:\/\/github.com\/Bamyers99\/pi-utils.git<\/li>\n\n\n\n<li>.\/pi-utils\/pi-setup_mythtv_31.sh\n<ul class=\"wp-block-list\">\n<li>default - No<\/li>\n\n\n\n<li>mythplugins - Yes<\/li>\n\n\n\n<li>auto start mythfrontend - Yes<\/li>\n\n\n\n<li>Install mythbackend scripts - Yes<\/li>\n\n\n\n<li>Enable SSH - Optional, depends on if want remote administration<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>temporarily comment out $HOME\/run_mythfrontend.sh in .bashrc<\/li>\n\n\n\n<li>sudo reboot<\/li>\n\n\n\n<li>.\/pi-mythbackend-helper.sh<\/li>\n\n\n\n<li>sudo reboot <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configure Schedules Direct<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sudo su mythtv ; cd $HOME<\/li>\n\n\n\n<li>tv_grab_zz_sdjson_sqlite --manage-lineups --config-file $HOME\/.mythtv\/SD.xmltv\n<ul class=\"wp-block-list\">\n<li>login after creating an account on <a href=\"https:\/\/www.schedulesdirect.org\/\">Schedules Direct<\/a> (external site)<\/li>\n\n\n\n<li>5: Initialize local database<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>tv_grab_zz_sdjson_sqlite --configure --config-file $HOME\/.mythtv\/SD.xmltv\n<ul class=\"wp-block-list\">\n<li>yes for lineup to use<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>tv_grab_zz_sdjson_sqlite --days 0 --config-file $HOME\/.mythtv\/SD.xmltv<\/li>\n\n\n\n<li>tv_grab_zz_sdjson_sqlite --manage-lineups --config-file $HOME\/.mythtv\/SD.xmltv\n<ul class=\"wp-block-list\">\n<li>Select Manage database lineup channel selection. Then Choose which channels are selected. n=no<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Switch back to user 'pi' by :exit<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Setup MythTV backend<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>.\/run_mythsetup.sh<\/li>\n\n\n\n<li>General settings\n<ul class=\"wp-block-list\">\n<li>Host Address Backend Setup, set Security PIN (required) to 0000<\/li>\n\n\n\n<li>Program Schedule Downloading Options -&gt; Automatically update program listings -&gt; Guide Data Program execution start\/end\n<ul class=\"wp-block-list\">\n<li>Deselect Run guide data program at time suggested by the grabber<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Capture cards\n<ul class=\"wp-block-list\">\n<li>New card\n<ul class=\"wp-block-list\">\n<li>configure new card\n<ul class=\"wp-block-list\">\n<li>deselect Use DVB Card for Active EIT scan<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>New card\n<ul class=\"wp-block-list\">\n<li>configure new card\n<ul class=\"wp-block-list\">\n<li>change the DVB Device to the second tuner (adapter1)<\/li>\n\n\n\n<li>deselect Use DVB Card for Active EIT scan<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Video sources\n<ul class=\"wp-block-list\">\n<li>New video source\n<ul class=\"wp-block-list\">\n<li>configure new source\n<ul class=\"wp-block-list\">\n<li>change name to SD<\/li>\n\n\n\n<li>Listings Grabber: Multinational (Schedules Direct JSON web services with SQLite\u2026<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Input connections\n<ul class=\"wp-block-list\">\n<li>Card 1\n<ul class=\"wp-block-list\">\n<li>Display name: Tuner 1<\/li>\n\n\n\n<li>Video Source: SD<\/li>\n\n\n\n<li>Scan for Channels\n<ul class=\"wp-block-list\">\n<li>Scan<\/li>\n\n\n\n<li>Insert all<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Card 2\n<ul class=\"wp-block-list\">\n<li>Display name: Tuner 2<\/li>\n\n\n\n<li>Video Source: SD<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Channel Editor\n<ul class=\"wp-block-list\">\n<li>Set unwanted channels to Not visible<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Storage Groups\n<ul class=\"wp-block-list\">\n<li>Default: \/srv\/mythtv\/recordings<\/li>\n\n\n\n<li>DB Backups: \/srv\/mythtv\/db_backups<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Exit setup<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Setup MythTV frontend<\/h2>\n\n\n\n<p>The MythTV frontend can be setup on any computer with WiFi or network connectivity to the Raspberry Pi.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>.\/run_mythfrontend.sh<\/li>\n\n\n\n<li>Setup\n<ul class=\"wp-block-list\">\n<li>Setup Wizard\n<ul class=\"wp-block-list\">\n<li>Audio device: ALSA:hdmi:CARD=vc4hdmi0,DEV=0<\/li>\n\n\n\n<li>Dolby Digital<\/li>\n\n\n\n<li>5.1 Channel Audio<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Video\n<ul class=\"wp-block-list\">\n<li>Playback\n<ul class=\"wp-block-list\">\n<li>General\n<ul class=\"wp-block-list\">\n<li>Action on playback exit: Always Prompt (excluding Live TV)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Current Video Playback Profile\n<ul class=\"wp-block-list\">\n<li>Standard &amp; OpenL YV12\n<ul class=\"wp-block-list\">\n<li>Deinterlacer quality (single rate): None<\/li>\n\n\n\n<li>Deinterlacer quality (double rate): None<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>To stop frontend exit from turning off the TV use:  .\/run_mythfrontend.sh -O PowerOffTVOnExit=0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sony RMT-TX102U CEC Remote Setup<\/h2>\n\n\n\n<p>Steps to allow more remote control buttons to control the MythTV frontend.<\/p>\n\n\n\n<p>The Sony TV forwards some button presses to the Raspberry Pi via the HDMI cable using the CEC protocol.<\/p>\n\n\n\n<p>Sony remote button codes can be found in this <a href=\"https:\/\/brucemyers.com\/?p=217\" data-type=\"post\" data-id=\"217\">blog post<\/a>.<\/p>\n\n\n\n<p>MythTV default key bindings can be found in this <a href=\"https:\/\/brucemyers.com\/?p=226\" data-type=\"post\" data-id=\"226\">blog post<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>frontend Setup\n<ul class=\"wp-block-list\">\n<li>Edit Keys\n<ul class=\"wp-block-list\">\n<li>Global -&gt; SELECT -&gt; Add remotes Select button<\/li>\n\n\n\n<li>Global -&gt; INFO -&gt; Remove binding<\/li>\n\n\n\n<li>TV Playback -&gt; OSDNAVIGATION -&gt; Add remotes Display button<\/li>\n\n\n\n<li>TV Playback -&gt; MENUYELLOW -&gt; Remove binding<\/li>\n\n\n\n<li>TV Playback -&gt; GUIDE -&gt; Add remotes Yellow button<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Exit setup<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Copy filesystem root to external drive<\/h2>\n\n\n\n<p>Copying the filesystem root to the external drive preserves a copy of the installation on the microSD card should the external drive need to be  replaced.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sudo systemctl stop mythtv-backend.service<\/li>\n\n\n\n<li>sudo .\/pi-SDtoHD-helper.sh -d \/dev\/sda<\/li>\n\n\n\n<li>cat \/mnt\/etc\/fstab : original root commented out, new root on last line<\/li>\n\n\n\n<li>cat \/boot\/cmdline.txt : root= should point to the PARTUUID for the external drive<\/li>\n\n\n\n<li>sudo reboot<\/li>\n\n\n\n<li>lsblk : verify that root (\/) is mounted on external drive<\/li>\n\n\n\n<li>Uncomment $HOME\/run_mythfrontend.sh in .bashrc<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installing Chromium<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sudo apt-get install xserver-xorg x11-xserver-utils xinit openbox<\/li>\n\n\n\n<li>sudo apt-get install chromium-browser<\/li>\n\n\n\n<li>Edit <code>\/etc\/xdg\/openbox\/autostart<\/code> and add the following<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Disable any form of screen saver \/ screen blanking \/ power management\nxset s off\nxset s noblank\nxset -dpms\n\n# Allow quitting the X server with Ctrl-Alt-Backspace\nsetxkbmap -option terminate:ctrl_alt_bksp\n\n# Start Chromium\nchromium-browser\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>startx --<\/code><\/li>\n\n\n\n<li>Ctrl-Alt-Backspace to exit, F11 to toggle fullscreen<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Process for creating a Raspberry Pi 4 Over-the-air (OTA) DVR to watch and record TV shows.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[38],"class_list":["post-258","post","type-post","status-publish","format-standard","hentry","category-misc","tag-mythtv"],"_links":{"self":[{"href":"https:\/\/brucemyers.com\/index.php?rest_route=\/wp\/v2\/posts\/258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brucemyers.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/brucemyers.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/brucemyers.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/brucemyers.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258"}],"version-history":[{"count":15,"href":"https:\/\/brucemyers.com\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions"}],"predecessor-version":[{"id":289,"href":"https:\/\/brucemyers.com\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions\/289"}],"wp:attachment":[{"href":"https:\/\/brucemyers.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/brucemyers.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/brucemyers.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}