{"id":3660,"date":"2014-07-21T20:28:22","date_gmt":"2014-07-21T19:28:22","guid":{"rendered":"http:\/\/www.haydnwilliams.com\/blog\/?p=3660"},"modified":"2022-04-11T21:33:00","modified_gmt":"2022-04-11T20:33:00","slug":"rpi-airpi-air-quality-station-setup","status":"publish","type":"post","link":"https:\/\/www.haydnwilliams.com\/blog\/rpi-airpi-air-quality-station-setup\/","title":{"rendered":"RPi \/ AirPi air quality station &#8211; Setup"},"content":{"rendered":"<p>I&#8217;ve recently been working with the <a title=\"Atmospheric Chemistry, University of Leicester\" href=\"http:\/\/www2.le.ac.uk\/departments\/chemistry\/research\/atmospheric-chemistry-1\" target=\"_blank\" rel=\"noopener\">Atmospheric Chemistry group<\/a> at the University of Leicester, setting up some AirPis. The <a title=\"AirPi website\" href=\"http:\/\/airpi.es\" target=\"_blank\" rel=\"noopener\">AirPi is a small board<\/a> which pairs with a <a title=\"Raspberry Pi website\" href=\"http:\/\/www.raspberrypi.org\" target=\"_blank\" rel=\"noopener\">Raspberry Pi<\/a>, and reads a number of air quality measures. There will doubtless be future posts about the software, sensor accuracy and reliability, <em>etc<\/em>., but this one is about just setting the thing up in the first place.<\/p>\n<div id=\"attachment_3739\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3739\" class=\"size-full wp-image-3739\" src=\"http:\/\/www.haydnwilliams.com\/blog\/wp-content\/uploads\/2014\/07\/2014-07-21f.jpg\" alt=\"AirPi on top of a Raspberry Pi. \u00a9\u00a0Haydn Williams 2014\" width=\"800\" height=\"610\" \/><p id=\"caption-attachment-3739\" class=\"wp-caption-text\">AirPi on top of a Raspberry Pi. \u00a9\u00a0Haydn Williams 2014<\/p><\/div>\n<p>Step one is to get the Raspberry Pi up and running. I downloaded Raspian Wheezy from the <a title=\"Raspberry Pi OS downloads\" href=\"http:\/\/www.raspberrypi.org\/downloads\/\" target=\"_blank\" rel=\"noopener\">official Raspberry Pi downloads website<\/a>, and installed it using the SD card slot on my Macbook Pro, although there are <a title=\"Disk image installation instructions\" href=\"http:\/\/www.raspberrypi.org\/documentation\/installation\/installing-images\/README.md\" target=\"_blank\" rel=\"noopener\">instructions for other OSes too<\/a>.<\/p>\n<p>Once it&#8217;s installed and the Pi is running, we need to change the password for the default account to something else. You can do this through the &#8220;advanced&#8221; menu of the initial config screen when the machine first boots. Alternatively boot the machine yourself manually, log in as the default account (username: <em>pi<\/em>, password: <em>raspberry<\/em>) and run the following:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">passwd<\/pre>\n<p>You can also use that initial config screen\u00a0to set the hostname for the machine (in the &#8220;advanced&#8221; section) and to disable SSH if you&#8217;re not going to be using it.<\/p>\n<p>Now, set the time zone:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">sudo\u00a0dpkg-reconfigure tzdata<\/pre>\n<p><strong>Set up Networking<\/strong><br \/>\nNext we&#8217;ll want some kind of internet connectivity. If you&#8217;ve got a Model B board then you&#8217;ve got an ethernet port and everything is very easy. If you&#8217;re on a Model A board then it gets a bit more difficult &#8211; the easiest option is a USB-to-ethernet adapter and SSH. A\u00a0plus is that when the AirPi is running in the field and recording data locally you don&#8217;t have to worry about security issues because you can just unplug the adapter. Alternatively you can go with wifi &#8211; I used the <a title=\"Edimax Wifi Adapter\" href=\"http:\/\/uk.rs-online.com\/web\/p\/wireless-adapters\/7603621\/\" target=\"_blank\" rel=\"noopener\">Edimax EW-7811Un<\/a> because it&#8217;s (allegedly) supported by Raspian Wheezy, so there was no messing\u00a0around with extra drivers. There are lots of instructions out there about how to get wifi working once your dongle is running; I&#8217;m sure some are better than others, but <a title=\"How to Configure Raspberry PI for WiFi using Edimax EW-7811Un\" href=\"http:\/\/kp4tr.org\/?page_id=320\" target=\"_blank\" rel=\"noopener\">these<\/a> worked for me. They only worked for a short time however; the USB-to-ethernet option proved the easiest and most reliable in the long-run.<\/p>\n<p>You can edit &#8216;\/etc\/network\/interfaces&#8217; to set up your network options. There are plenty of <a title=\"Neil Black - Raspberry Pi Beginner's Guide\" href=\"http:\/\/www.neil-black.co.uk\/raspberry-pi-beginners-guide\" target=\"_blank\" rel=\"noopener\">instructions<\/a> out there, but for wired access it might look like this (although I&#8217;ve fudged the IPs in the example below):<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nauto lo\r\n\r\niface lo inet loopback\r\n\r\n# Haydn's House\r\n#==============\r\niface eth0 inet static\r\naddress 192.168.0.123\r\nnetmask 255.255.255.0\r\nnetwork 192.168.0.1\r\nbroadcast 192.168.0.255\r\ngateway 192.168.0.254\r\nnameserver 192.168.0.1\r\n<\/pre>\n<p>Note that you may sometimes need to also <a title=\"Superuser.com - How do I set DNS details on a Raspberry Pi?\" href=\"http:\/\/superuser.com\/questions\/617796\/how-do-i-set-dns-servers-on-raspberry-pi\" target=\"_blank\" rel=\"noopener\">put DNS details in \/etc\/resolv.conf<\/a><\/p>\n<p><strong>Upgrade Software<\/strong><br \/>\nOnce you&#8217;ve got internet, it&#8217;s time to update everything which has been updated since your version of the OS was released:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo apt-get update\r\nsudo apt-get upgrade\r\n<\/pre>\n<p>It&#8217;ll take some time, depending on your internet connection speed.<\/p>\n<p><strong>Disable hardware<\/strong><br \/>\nIf appropriate, you can <a title=\"Raspberry Pi disable sound\" href=\"http:\/\/www.raspberrypi.org\/forums\/viewtopic.php?f=66&amp;t=18573\" target=\"_blank\" rel=\"noopener\">disable the onboard sound<\/a> card:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo vi \/etc\/modules\r\n# Then make sure there is a hash sign (#) in front of the snd-bcm385 line - it should look like this:\r\n\r\n# \/etc\/modules: kernel modules to load at boot time.\r\n#\r\n# This file contains the names of kernel modules that should be loaded\r\n# at boot time, one per line. Lines beginning with &quot;#&quot; are ignored.\r\n# Parameters can be specified after the module name.\r\n\r\n#snd-bcm2835\r\n<\/pre>\n<p>and <a title=\"pcm512x: probe of 1-004c failed with error -5 #273\" href=\"https:\/\/github.com\/raspberrypi\/firmware\/issues\/273\" target=\"_blank\" rel=\"noopener\">one more thing<\/a>&#8230;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo vi \/etc\/modprobe.d\/raspi-blacklist.conf\r\n\r\n# Then add the line below at the end:\r\nblacklist snd_soc_pcm512x\r\n<\/pre>\n<p>Another thing you might want to consider\u00a0is to <a title=\"Force output over HDMI\" href=\"http:\/\/raspberrypi.stackexchange.com\/questions\/2169\/how-do-i-force-the-raspberry-pi-to-turn-on-hdmi\" target=\"_blank\" rel=\"noopener\">force output over HDMI<\/a> (<em>i.e.<\/em> never\u00a0revert to\u00a0component out). Just add the following line to \/boot\/config.txt:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">hdmi_force_hotplug=1<\/pre>\n<p>This is useful because in the absence of an HDMI connection at startup (<em>e.g.<\/em> if the Pi is started headless in the field), it defaults to component-out being active. Setting the above option means that HDMI is always activated, so you can bring the Pi back to the office running on batteries and plug it straight into a monitor without having to reboot. This means you can also use the monitor to stop processes gracefully <em>etc<\/em>., which you might not have been able to do in the field without a monitor. Nice.<\/p>\n<p>At this point, you might want to give some though as to whether you&#8217;ll be accessing the data by SSH or SFTP on the Pi, or inserting the SD card into another computer. If it&#8217;s the latter, it&#8217;s probably best to read the section about creating a FAT partition in my post on advanced usage. It&#8217;s not pretty, but don&#8217;t say I didn&#8217;t warn you! \u00a0:)<\/p>\n<p>&nbsp;<\/p>\n<h2>Now we can prepare for the AirPi.<\/h2>\n<p>The <a title=\"Airpi.es\" href=\"http:\/\/www.airpi.es\" target=\"_blank\" rel=\"noopener\">AirPi.es website<\/a> is not being maintained at the moment (July 2014), and there are several sets of instructions floating around about how to set the board recording data. I&#8217;ve outlined below the method I used, which seemed to work fine.<\/p>\n<p><strong>Install git and some python tools<\/strong><br \/>\n<a title=\"Git SCM\" href=\"http:\/\/git-scm.com\" target=\"_blank\" rel=\"noopener\">Git<\/a> is to help us download various bits of code, a number of different <a title=\"Python\" href=\"https:\/\/www.python.org\" target=\"_blank\" rel=\"noopener\">Python<\/a> tools because that&#8217;s what the AirPi code is written in, i2c tools because that&#8217;s how one of the sensors communicates.<\/p>\n<p>If you&#8217;re running an old version of Raspbian then you&#8217;ll need to install quite a lot of stuff:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">sudo apt-get install git-core python-dev python-smbus python-setuptools python-requests python3 python3-dev python3-requests libxml2-dev libxslt1-dev python-lxml gpsd gpsd-clients python-gps i2c-tools<\/pre>\n<p>I have most recently done this with the 20th June 2014 release, in which git-core, RPi.GPIO and python3 already installed. This means you have marginally less to do:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">sudo apt-get install python-dev python-smbus python-setuptools python-requests python3-dev python3-requests libxml2-dev libxslt1-dev python-lxml i2c-tools<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>What You Don&#8217;t Need<\/strong><br \/>\nContrary to other installation instructions floating around, you <strong>do not<\/strong> need to install Python EEML (it&#8217;s no longer used in the AirPi code), nor do you need to use PIP to install requests or rpi.gpio (they&#8217;re both installed using apt-get along with everything else above).<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Install Twitter support for Python<\/strong><br \/>\nThis is used to Tweet when there is an error, via the new &#8216;notifications&#8217; module.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\neasy_install twitter\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Set up <abbr title=\"Inter-Integrated Circuit\">i2c<\/abbr><\/strong><br \/>\n<a title=\"I\u00b2C on Wikipedia\" href=\"https:\/\/en.wikipedia.org\/wiki\/I\u00b2C\" target=\"_blank\" rel=\"noopener\">i2c<\/a> is the bus over which the BMP085 pressure sensor communicates with the main Raspberry Pi. There are some <a title=\"I2C installation for Raspberry Pi\" href=\"http:\/\/skpang.co.uk\/blog\/archives\/575\" target=\"_blank\" rel=\"noopener\">good instructions here<\/a>, summarised below.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo vi \/etc\/modprobe.d\/raspi-blacklist.conf\r\n\r\n# Comment out the third line in raspi-blacklist.conf (blacklist i2c-bcm2708)\r\n\r\nsudo vi \/etc\/modules\r\n\r\n# Add &quot;i2c-dev&quot; (no quotes) onto a new line\r\n\r\nsudo adduser pi i2c\r\nsudo reboot\r\n\r\nsudo i2cdetect -y 1\r\n# If the AirPi is accurately detected over i2c, you should see the following:\r\n# 0 1 2 3 4 5 6 7 8 9 a b c d e f\r\n# 00: -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\r\n# 70: -- -- -- -- -- -- -- 77\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Test the GPS<\/strong><br \/>\nIf you&#8217;re using an Adafruit Ultimate GPS on your AirPi board, you can <a title=\"Raspberry Pi - GPS Setup and Python\" href=\"http:\/\/www.stuffaboutcode.com\/2013\/09\/raspberry-pi-gps-setup-and-python.html\" target=\"_blank\" rel=\"noopener\">enable support<\/a> by running the following:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo gpsd \/dev\/ttyAMA0 -F \/var\/run\/gpsd.sock\r\n<\/pre>\n<p>and then check it&#8217;s correctly reporting your location:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ncgps -s\r\n<\/pre>\n<p>Note that you&#8217;ll need to run the gpsd command after each reboot to start the daemon again (or <a title=\"Raspberry Pi - Run a script on start up\" href=\"http:\/\/raspberrywebserver.com\/serveradmin\/run-a-script-on-start-up.html\" target=\"_blank\" rel=\"noopener\">make it run on startup<\/a>).<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Get the AirPi code<\/strong><br \/>\nThis is the code which will take data from the sensors and either print to screen, save, or upload to an online service. There are a few different packages available &#8211; the rest of this post will assume you use one of the first three (all variations of the original code):<\/p>\n<ol>\n<li>The original Python-based AirPi.es code: <a title=\"GitHub - Tom Hartley \/ Airpi.es\" href=\"https:\/\/github.com\/tomhartley\/AirPi\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/tomhartley\/AirPi<\/a><\/li>\n<li>A revised version which includes CSV output:\u00a0<a title=\"GitHub - Guruthree AirPi\" href=\"https:\/\/github.com\/guruthree\/AirPi\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/guruthree\/AirPi<\/a><\/li>\n<li>My further-revised version which has a couple of tweaks for running headless:\u00a0<a title=\"GitHub - haydnw AirPi\" href=\"https:\/\/github.com\/haydnw\/AirPi\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/haydnw\/AirPi<\/a><\/li>\n<li><a title=\"Oswabox\" href=\"http:\/\/www.oswabox.org\" target=\"_blank\" rel=\"noopener\">oswabox<\/a> &#8211; Written in C and therefore needs compiling. Didn&#8217;t work for me, but the developers are promising great things:\u00a0<a title=\"GitHub - Oswabox\" href=\"https:\/\/github.com\/mgrennan\/oswabox\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/mgrennan\/oswabox<\/a><\/li>\n<li>For node.js users, there is <a title=\"node.js package for BMP085\" href=\"https:\/\/www.npmjs.org\/package\/bmp085\" target=\"_blank\" rel=\"noopener\">support for the BMP085<\/a>, but seemingly not much else.<\/li>\n<li>There is also a <a title=\"Nitrogen Project\" href=\"https:\/\/github.com\/nitrogenjs\/apps\" target=\"_blank\" rel=\"noopener\">nitrogenjs<\/a> package which <a title=\"nitrogen-airpi\" href=\"https:\/\/www.npmjs.org\/package\/nitrogen-airpi\" target=\"_blank\" rel=\"noopener\">supports the BMP085<\/a> (and it&#8217;s replacement, the BMP100).<\/li>\n<li>There has been <a title=\"Send AirPi-data to a local server (emoncms)\" href=\"http:\/\/airpi.freeforums.net\/thread\/100\/send-airpi-local-server-emoncms\" target=\"_blank\" rel=\"noopener\">work to support<\/a> the <a title=\"Emoncms\" href=\"http:\/\/emoncms.org\" target=\"_blank\" rel=\"noopener\">emoncms<\/a>\u00a0package in the original software; emoncms is described as providing &#8220;<em>open-source energy visualisation<\/em>&#8220;.<\/li>\n<\/ol>\n<p>To download and use my version of the code, do the following:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ncd ~\r\ngit clone https:\/\/github.com\/haydnw\/AirPi\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Add the AirPi folder to $PATH<\/strong><br \/>\nThis means that you can refer to the main airpictl.sh script without having to type the full path or &#8216;.\/&#8217; each time you want to run it. I&#8217;ve assumed that the software is installed at &#8216;~\/AirPi&#8217;.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo vi ~\/.profile\r\n\r\n# Then add the following to the end of the file:\r\nexport PATH=$PATH:\/home\/pi\/AirPi\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Add a Login Message<\/strong><br \/>\nThis step is entirely optional, but adds a nice <a title=\"HOW TO: Creating a dynamtic motd in Linux\" href=\"http:\/\/parkersamp.com\/2010\/10\/howto-creating-a-dynamic-motd-in-linux\/\" target=\"_blank\" rel=\"noopener\">message when a user logs in<\/a> and displays the current status of the AirPi, like so:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n=======================================================================\r\n        _               _  _\r\n  __ _ (_) _ __  _ __  (_)\/ |\r\n \/ _` || || '__|| '_ \\ | || |\r\n| (_| || || |   | |_) || || |\r\n \\__,_||_||_|   | .__\/ |_||_|\r\n                |_|\r\nIP: 123.321.12.33\r\n&#x5B;AirPi] Status: SAMPLING\r\n=======================================================================\r\nairpi1:~ $\r\n<\/pre>\n<p>First we&#8217;ll install figlet so that we can produce the banner.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo apt-get install figlet\r\n<\/pre>\n<p>Then create the new dynamic &#8220;message of the day&#8221; file &#8216;\/usr\/local\/bin\/motddynamic&#8217; as below:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/sh\r\n\r\n# =========================================\r\n# File:    motddynamic\r\n# Purpose: Show hostname and IP on login.\r\n#\u00a0Author:  Haydn Williams &lt;pi@hwmail.co.uk&gt;\r\n# Date:    August 2014\r\n# =========================================\r\n\r\nclear\r\n\r\nhostname=`hostname`\r\nip=`hostname -I`\r\n\r\necho &quot;=======================================================================&quot;\r\nfiglet -o $hostname\r\necho &quot;IP: $ip&quot;\r\necho `\/home\/pi\/AirPi\/airpictl.sh status`\r\necho &quot;=======================================================================&quot;\r\n<\/pre>\n<p>Once you&#8217;ve created the file, we need to load it on login by adding the following lines to &#8216;\/etc\/profile&#8217;:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n# Dynamic motd\r\n\/usr\/local\/bin\/motddynamic\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Make a Backup<\/strong><br \/>\nIf you use a Mac, now is the time to make a backup of the SD card. This is done in the form of an &#8216;image&#8217; which takes a snapshot of the entire card. This makes it very easy to get the card back to this point again in the future, without having to install everything again manually. There is a <a title=\"How to Clone Raspberry Pi SD Cards\" href=\"http:\/\/computers.tutsplus.com\/articles\/how-to-clone-raspberry-pi-sd-cards-using-the-command-line-in-os-x--mac-59911\" target=\"_blank\" rel=\"noopener\">very good set of instructions<\/a> on tutsplus.com so I don&#8217;t intend to reinvent the wheel here.<\/p>\n<p><strong><br \/>\nStart recording data!<\/strong><br \/>\nI&#8217;ll add a new post soon which covers how to use my modified version of the software, as it has quite a few extra features not included in the original release from the makers of the AirPi. These include:<\/p>\n<ul>\n<li>Added &#8216;airpictl.sh&#8217; script to control sampling in different modes.<\/li>\n<li>Added ability to output average data (e.g. read every 1 min for 10 mins, then output the average for the 10 mins).<\/li>\n<li>Added ability to record metadata such as Raspberry Pi serial no. and operator name at start of run.<\/li>\n<li>Added ability to start automatically at boot for headless operation (does not require any user interaction).<\/li>\n<li>Added &#8216;Notifications&#8217; module which allow messages to be sent when errors occur. Includes email, SMS and tweet.<\/li>\n<li>Standard print-to-screen format tidied up and made more digestable.<\/li>\n<li>Can automatically name CSV files and HTTP titles using date and hostname.<\/li>\n<li>Added ThingSpeak integration.<\/li>\n<li>Added the following new options to &#8216;settings.cfg&#8217;:\n<ul class=\"task-list\">\n<li>Greater control of LED behaviour.<\/li>\n<li>Can disable error messages printed to screen.<\/li>\n<li>Can print to screen in CSV format.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve recently been working with the Atmospheric Chemistry group at the University of Leicester, setting up some AirPis which they purchased recently. The AirPi is a small board which pairs with a Raspberry Pi, and reads a number of air quality measures.<\/p>\n","protected":false},"author":2,"featured_media":3739,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[1025,1023,1035,1036,1022,1032,1024],"class_list":["post-3660","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it","tag-air-quality","tag-airpi","tag-airpillution","tag-oswabox","tag-raspberry-pi","tag-rpi","tag-weather-station"],"_links":{"self":[{"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/posts\/3660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/comments?post=3660"}],"version-history":[{"count":0,"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/posts\/3660\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/media\/3739"}],"wp:attachment":[{"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/media?parent=3660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/categories?post=3660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.haydnwilliams.com\/blog\/wp-json\/wp\/v2\/tags?post=3660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}