{"id":499,"date":"2020-01-02T05:58:55","date_gmt":"2020-01-02T11:58:55","guid":{"rendered":"http:\/\/blog.captainsglen.com\/?p=499"},"modified":"2020-01-03T09:36:36","modified_gmt":"2020-01-03T15:36:36","slug":"digital-photo-frame-diy","status":"publish","type":"post","link":"https:\/\/blog.captainsglen.com\/?p=499","title":{"rendered":"Digital Photo Frame &#8211; DIY"},"content":{"rendered":"<p>If you&#8217;ve ever fancied a digital display frame, but perhaps wanted more than just a simple carousel of your pictures, or greater control over how the device behaves, then read on.<\/p>\n<h1>What we&#8217;ll build<\/h1>\n<p>A digital display board that showcases your photographs, with an overlaid calendar and weather forecast. For those of you into home automation, I&#8217;ll also cover how to turn the display on and off by integrating with Samsung SmartThings home hub &#8211; the basic approach could serve as a starting point for other integrations.<\/p>\n<h2>How we&#8217;ll do it<\/h2>\n<p>A Raspberry Pi zero w (about $26 with case and power supply) combined with a Dell 24&#8243; monitor (about $120), and the\u00a0<a href=\"https:\/\/dakboard.com\/site\" target=\"_blank\" rel=\"noopener noreferrer\">Dakboard<\/a> web digital display service.<\/p>\n<h1>Dakboard<\/h1>\n<p>The simplest way to get started is to follow <a href=\"https:\/\/blog.dakboard.com\/diy-wall-display\/\">this handy guide.<\/a> This will help you get your Pi up and running, though I found that for the release of Raspbian current as of December 2019, I need to follow the alternative instructions for updating the autostart instructions :<\/p>\n<pre>\/etc\/xdg\/lxsession\/LXDE-pi\/autostart\n\n<\/pre>\n<h1>Automating the Pi display<\/h1>\n<p>We&#8217;re going to create a RESTful web service (API) that can be invoked with a simple URL to turn the display on and off, this is what our home automation will call. This will leverage Python3, Flask, and NGINX.<\/p>\n<h2>NGINX<\/h2>\n<p>This is a popular web server for the Pi, you could use apache but the tutorials I was following used nginx.<\/p>\n<pre class=\"p1\"><span class=\"s1\">sudo apt-get install nginx<\/span><\/pre>\n<h2>Python3<\/h2>\n<p>If your Raspbian install is fresh (you used noobs to get up and running) you probably don&#8217;t need to sudo apt-get update, but it might not include Python3, so let&#8217;s install that.<\/p>\n<p>Log into your Pi (I use SSH from my Macbook)<\/p>\n<pre>sudo apt-get install python3-pip<\/pre>\n<h2 class=\"p1\"><span class=\"s1\">UWSGI flask<\/span><\/h2>\n<p>This will install the flask API framework, which greatly simplifies the work required to create RESTful apis in python.<\/p>\n<pre>sudo pip3 install flask uwsgi<\/pre>\n<pre class=\"p1\"><span class=\"s1\">sudo pip3 install flask-restful<\/span><\/pre>\n<h2>Python api program<\/h2>\n<p>You can clone from https:\/\/github.com\/klcampbell6502\/pirest.git or use the code as displayed there.<\/p>\n<pre>from flask import Flask\nfrom flask_restful import Resource, Api\nimport os\n\u00a0\napp = Flask(__name__)\n\u00a0\napi = Api(app)\n\nclass ScreenOff(Resource):\n    def get(self):\n        os.system(\"vcgencmd display_power 0\")\n        return \"off\"\n\u00a0\nclass ScreenOn(Resource):\n    def get(self):\n        os.system(\"vcgencmd display_power 1\")\n        return \"on\"\n\napi.add_resource(ScreenOff,'\/screen\/off')\napi.add_resource(ScreenOn,'\/screen\/on')\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0')<\/pre>\n<h3>Testing<\/h3>\n<p>We should now be able to test the flask API using the debug environment:<\/p>\n<pre>uwsgi --socket 0.0.0.0:8000 --protocol=http -w api:app<\/pre>\n<p>and then invoke the URL:<\/p>\n<pre>http:\/\/yourpiaddress:8000\/screen\/off<\/pre>\n<p>You should see the single word &#8220;off&#8221; in your browser, and if you look in your ssh output you should see something like this:<\/p>\n<pre class=\"p1\"><span class=\"s1\">*** uWSGI is running in multiple interpreter mode ***<\/span>\n<span class=\"s1\">spawned uWSGI worker 1 (and the only) (pid: 7822, cores: 1)<\/span>\n<span class=\"s1\">display_power=0\n<\/span><span class=\"s1\">[pid: 7822|app: 0|req: 1\/1] 192.168.86.24 () {32 vars in 644 bytes} [Wed Jan<span class=\"Apple-converted-space\">\u00a0 <\/span>1 12:16:54 2020] GET \/screen\/off =&gt; generated 6 bytes in 273 msecs (HTTP\/1.1 200) 2 headers in 70 bytes (1 switches on core 0)<\/span>\n<span class=\"s1\">[pid: 7822|app: 0|req: 2\/2] 192.168.86.24 () {32 vars in 574 bytes} [Wed Jan<span class=\"Apple-converted-space\">\u00a0 <\/span>1 12:16:55 2020] GET \/favicon.ico =&gt; generated 233 bytes in 330 msecs (HTTP\/1.1 404) 2 headers in 72 bytes (1 switches on core 0)<\/span><\/pre>\n<p>Oh, and your HDMI display is now off \ud83d\ude42 Type ctrl-C in your ssh session to stop the uWSGI test server. To make things more robust we&#8217;re now going to integrate uWSGI with the nginx web server.<\/p>\n<h2>nginx integration<\/h2>\n<p>If you didn&#8217;t download the project from git then you&#8217;ll need to create a file uwsgi.ini in the directory containing your .py file:<\/p>\n<pre class=\"p1\"><span class=\"s1\">[uwsgi]<\/span>\n<span class=\"s1\">chdir = \/home\/pi\/Documents\/pirest<\/span>\n<span class=\"s1\">module = api:app<\/span>\n<span class=\"s1\">master = true<\/span>\n<span class=\"s1\">processes = 1<\/span>\n<span class=\"s1\">threads = 2<\/span>\n\n<span class=\"s1\">uid = www-data<\/span>\n<span class=\"s1\">gid = www-data<\/span>\n\n<span class=\"s1\">socket = \/tmp\/pirest.sock<\/span>\n<span class=\"s1\">chmod-socket = 664<\/span>\n<span class=\"s1\">vacuum = true<\/span>\n<span class=\"s1\">die-on-term = true<\/span>\n<span class=\"s1\">touch-reload = \/home\/pi\/Documents\/pirest\/api.py<\/span><\/pre>\n<p>This will provide the startup instructions for uwsgi when invoked from nginx.<br \/>Now we&#8217;ll get rid of the default nginx site<\/p>\n<pre>sudo rm \/etc\/nginx\/sites-enabled\/default<\/pre>\n<p>and now create a proxy file<\/p>\n<pre class=\"p1\"><span class=\"s1\">sudo nano \/etc\/nginx\/sites-available\/pirest_proxy<\/span><\/pre>\n<p>containing the following:<\/p>\n<pre class=\"p1\"><span class=\"s1\">server {<\/span>\n<span class=\"s1\">listen 80;<\/span>\n<span class=\"s1\">server_name localhost;<\/span>\n<span class=\"s1\">location \/ { try_files $uri @app; }<\/span>\n<span class=\"s1\">location @app {<\/span>\n<span class=\"s1\">include uwsgi_params;<\/span>\n<span class=\"s1\">uwsgi_pass unix:\/tmp\/pirest.sock;<\/span>\n<span class=\"s1\">}<\/span>\n<span class=\"s1\">}<\/span><\/pre>\n<p>Now we need to create a symbolic link to this file<\/p>\n<pre>sudo ln -s \/etc\/nginx\/sites-available\/pirest_proxy \/etc\/nginx\/sites-enabled<\/pre>\n<p>then restart nginx<\/p>\n<pre>sudo systemctl restart nginx<\/pre>\n<h3>Set uWSGI to run on boot<\/h3>\n<pre>cd \/etc\/systemd\/system<\/pre>\n<pre>sudo nano uwsgi.service<\/pre>\n<p>and into this new file, paste the following:<\/p>\n<pre class=\"p1\"><span class=\"s1\">[Unit]<\/span>\n<span class=\"s1\">Description=uWSGI Service<\/span>\n<span class=\"s1\">After=network.target<\/span>\n\n<span class=\"s1\">[Service]<\/span>\n<span class=\"s1\">User=pi<\/span>\n<span class=\"s1\">Group=www-data<\/span>\n<span class=\"s1\">WorkingDirectory=\/home\/pi\/Documents\/pirest<\/span>\n<span class=\"s1\">ExecStart=\/usr\/local\/bin\/uwsgi --ini \/home\/pi\/Documents\/pirest\/uwsgi.ini<\/span>\n<span class=\"s1\">Environment=\"PATH=\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin:$<\/span>\n\n<span class=\"s1\">[Install]<\/span>\n<span class=\"s1\">WantedBy=multi-user.target<\/span><\/pre>\n<p>restart the daemon so the new configuration is picked up:<\/p>\n<pre>sudo systemctl daemon-reload<\/pre>\n<p>and start the service we&#8217;ve just defined:<\/p>\n<pre>sudo systemctl start uwsgi.service<\/pre>\n<p>You can check the status of the running service like this:<\/p>\n<pre>sudo systemctl status uwsgi.service<\/pre>\n<p>you should see something like this:<\/p>\n<pre class=\"p1\"><span class=\"s2\"><b>?<\/b><\/span><span class=\"s1\"> uwsgi.service - uWSGI Service<\/span>\n<span class=\"s1\"><span class=\"Apple-converted-space\"> \u00a0 <\/span>Loaded: loaded (\/etc\/systemd\/system\/uwsgi.service; disabled; vendor preset: enabled)<\/span>\n<span class=\"s1\"><span class=\"Apple-converted-space\"> \u00a0 <\/span>Active: <\/span><span class=\"s2\"><b>active (running)<\/b><\/span><span class=\"s1\"> since Wed 2020-01-01 12:49:52 CST; 1min 3s ago<\/span>\n\n<span class=\"s1\"> Main PID: 8038 (uwsgi)<\/span>\n<span class=\"s1\"><span class=\"Apple-converted-space\"> \u00a0 <\/span>Memory: 13.1M<\/span>\n<span class=\"s1\"><span class=\"Apple-converted-space\"> \u00a0 <\/span>CGroup: \/system.slice\/uwsgi.service<\/span>\n<span class=\"s1\"><span class=\"Apple-converted-space\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>??8038 \/usr\/local\/bin\/uwsgi --ini \/home\/pi\/Documents\/pirest\/uwsgi.ini<\/span>\n<span class=\"s1\"><span class=\"Apple-converted-space\"> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>??8044 \/usr\/local\/bin\/uwsgi --ini \/home\/pi\/Documents\/pirest\/uwsgi.ini<\/span>\n<span class=\"s1\">Jan 01 12:49:55 piboard02 uwsgi[8038]: mapped 143936 bytes (140 KB) for 2 cores<\/span>\n<span class=\"s1\">Jan 01 12:49:55 piboard02 uwsgi[8038]: *** Operational MODE: threaded ***<\/span>\n<span class=\"s1\">Jan 01 12:50:07 piboard02 uwsgi[8038]: WSGI app 0 (mountpoint='') ready in 12 seconds on interpreter 0x16984f0 pid: 8038 (de<\/span>\n<span class=\"s1\">Jan 01 12:50:07 piboard02 uwsgi[8038]: *** uWSGI is running in multiple interpreter mode ***<\/span>\n<span class=\"s1\">Jan 01 12:50:07 piboard02 uwsgi[8038]: spawned uWSGI master process (pid: 8038)<\/span>\n<span class=\"s1\">Jan 01 12:50:07 piboard02 uwsgi[8038]: spawned uWSGI worker 1 (pid: 8044, cores: 2)<\/span>\n<span class=\"s1\">Jan 01 12:50:07 piboard02 uwsgi[8038]: display_power=0<\/span>\n<span class=\"s1\">Jan 01 12:50:07 piboard02 uwsgi[8038]: [pid: 8044|app: 0|req: 1\/1] 192.168.86.24 () {42 vars in 767 bytes} [Wed Jan<span class=\"Apple-converted-space\">\u00a0 <\/span>1 12:50<\/span>\n<span class=\"s1\">Jan 01 12:50:15 piboard02 uwsgi[8038]: display_power=1<\/span>\n<span class=\"s1\">Jan 01 12:50:15 piboard02 uwsgi[8038]: [pid: 8044|app: 0|req: 2\/2] 192.168.86.24 () {40 vars in 734 bytes} [Wed Jan<span class=\"Apple-converted-space\">\u00a0 <\/span>1 12:50<\/span>\n<span class=\"s3\">lines 1-19\/19 (END)<\/span><\/pre>\n<p>You&#8217;ll see here that I tried the service on and off by entering this URL in my browser:<\/p>\n<pre>http:\/\/piboard02\/screen\/on<\/pre>\n<p>The final step is to ensure that this starts with every boot:<\/p>\n<pre>sudo systemctl enable uwsgi.service<\/pre>\n<p>and you&#8217;ll see something along these lines:<\/p>\n<pre>\u201cCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/uwsgi.service \/etc\/systemd\/system\/uwsgi.service\u201d<\/pre>\n<p>Reboot and test using the URL &#8211; give it time to boot, especially if using a pi zero as they&#8217;re pretty slow.<\/p>\n<h1>SmartThings Integration<\/h1>\n<h2>Device Handler<\/h2>\n<p>OK, so you&#8217;ve got a pi running a display board, and you can turn the HDMI output on and off by opening a URL. Now to create a device handler for SmartThings that enables you to include this in automations, and of course control it from your SmartThings app.<\/p>\n<p>Go grab the source over at my <a href=\"https:\/\/github.com\/klcampbell6502\/SmartThingsPublic\/tree\/master\/devicetypes\/klcampbell6502\/rest-switch.src\">github repo<\/a>. For now, I&#8217;m going to assume the reader knows how to create an account at the Samsung developer site\u00a0<a href=\"https:\/\/graph.api.smartthings.com\/\">https:\/\/graph.api.smartthings.com\/<\/a><\/p>\n<p><a href=\"https:\/\/blog.captainsglen.com\/?attachment_id=509\" rel=\"attachment wp-att-509\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-509\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.02.06-AM-500x104.png\" alt=\"\" width=\"500\" height=\"104\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.02.06-AM-500x104.png 500w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.02.06-AM-1024x213.png 1024w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.02.06-AM-768x160.png 768w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.02.06-AM.png 1336w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Go to My Device Handlers, and Create &#8211; From Code, then paste the code from Git. Or, you could just import my repo into your account. You&#8217;ll then need to publish it, choosing &#8220;just me&#8221; should be sufficient.<\/p>\n<p><a href=\"https:\/\/blog.captainsglen.com\/?attachment_id=511\" rel=\"attachment wp-att-511\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-511\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.03.20-AM-500x466.png\" alt=\"\" width=\"500\" height=\"466\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.03.20-AM-500x466.png 500w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.03.20-AM-768x715.png 768w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-03-at-9.03.20-AM.png 934w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<h2>New Device<\/h2>\n<p>Using the IDE, create a new device:<\/p>\n<p>\u00a0<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"710\" height=\"220\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/CreateDevice.jpg\" alt=\"\" class=\"wp-image-500\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/CreateDevice.jpg 710w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/CreateDevice-500x155.jpg 500w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Complete the new device screen &#8211; use your own values for Network ID (which must be unique), name, label, etc. I&#8217;ve used IP address for network ID, but what you use actually doesn&#8217;t matter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you get to the Type pulldown, scroll all the way down past the commercial handlers until you see the REST Switch device handler we just created. Location and Hub must be set to your SmartThings hub, you&#8217;ll typically only see a single choice in those pulldowns.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"698\" height=\"1024\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.27.24-PM-698x1024.png\" alt=\"\" class=\"wp-image-501\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.27.24-PM-698x1024.png 698w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.27.24-PM-341x500.png 341w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.27.24-PM-768x1127.png 768w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.27.24-PM.png 970w\" sizes=\"auto, (max-width: 698px) 100vw, 698px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"567\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-1024x567.png\" alt=\"\" class=\"wp-image-503\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-1024x567.png 1024w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-500x277.png 500w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-768x425.png 768w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-1536x850.png 1536w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-2048x1133.png 2048w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-672x372.png 672w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.45-PM-1038x576.png 1038w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the Edit link alongside Settings in the device display, and then enter the IP address and port 80 for your Pi. Your hub must be on the same network as your pi, as the hub itself will run the device handler code we just established.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"192\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.20-PM-1024x192.png\" alt=\"\" class=\"wp-image-502\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.20-PM-1024x192.png 1024w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.20-PM-500x94.png 500w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.20-PM-768x144.png 768w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.20-PM-1536x287.png 1536w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/Screen-Shot-2020-01-01-at-1.31.20-PM.png 1774w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After a couple of minutes the newly created device should appear in your app:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"594\" height=\"1024\" src=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/IMG_1912-594x1024.jpg\" alt=\"\" class=\"wp-image-514\" srcset=\"https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/IMG_1912-594x1024.jpg 594w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/IMG_1912-290x500.jpg 290w, https:\/\/blog.captainsglen.com\/wp-content\/uploads\/2020\/01\/IMG_1912.jpg 750w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;ve ever fancied a digital display frame, but perhaps wanted more than just a simple carousel of your pictures, or greater control over [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"wpupg_custom_link":[],"wpupg_custom_link_behaviour":[],"wpupg_custom_link_nofollow":[],"wpupg_custom_image":[],"wpupg_custom_image_id":[],"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":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":"","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},"jetpack_post_was_ever_published":false},"categories":[3],"tags":[45,46],"class_list":["post-499","post","type-post","status-publish","format-standard","hentry","category-technique","tag-dakboard","tag-raspberry-pi"],"acf":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pePLXi-83","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=\/wp\/v2\/posts\/499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=499"}],"version-history":[{"count":7,"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=\/wp\/v2\/posts\/499\/revisions"}],"predecessor-version":[{"id":516,"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=\/wp\/v2\/posts\/499\/revisions\/516"}],"wp:attachment":[{"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.captainsglen.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}