{"id":693,"date":"2019-12-19T09:01:46","date_gmt":"2019-12-19T14:01:46","guid":{"rendered":"https:\/\/crossan007.dev\/blog\/?p=693"},"modified":"2020-02-10T15:03:57","modified_gmt":"2020-02-10T20:03:57","slug":"configuring-multiple-networked-apc-ups-devices","status":"publish","type":"post","link":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/","title":{"rendered":"Configuring Multiple Networked OR USB APC UPS devices"},"content":{"rendered":"\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=crossan007\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n\n<p>As any proper IT-nerd would agree, UPS devices are critical pieces of equipment not only in the data center, but also at home.  However, most home users are not in a position to acquire a massive 10+ <a href=\"https:\/\/www.power-solutions.com\/watts-va\">kilovolt-amp<\/a> UPS capable of protecting all circuits by which our various &#8220;personal devices&#8221; are powered; rather, most home\/small office UPS installations are often small desktop units usually under 3kVA.  In this scenario, these smaller units are typically allocated to individual devices \/ ares, and are typically only responsible for signaling the status of the incoming utility power to one device.<\/p>\n\n\n\n<p>What about using multiple UPS devices for different components of the same &#8220;workspace&#8221;?  Or home networks with access points and switches in more than one location (therefore each having its own battery backup)?  How would one monitor multiple distributed battery backup units (presuming each UPS unit has only USB connectivity)?<\/p>\n\n\n\n<h2>APCUPSD<\/h2>\n\n\n\n<p>Enter <a href=\"http:\/\/www.apcupsd.org\/\"><em>apcupsd<\/em><\/a>: &#8220;A daemon for controlling APC UPSes.&#8221;  Unfortunately, the plurality of this utility&#8217;s tagline indicates a wide range of supported devices rather than multiple concurrently connected devices.  To date<a href=\"https:\/\/wiki.debian.org\/apcupsd#Configuring_.28Multiple_UPS_Devices.29\">, I&#8217;ve found one article describing how to configure <em>apcupsd <\/em>to support <strong>multiple<\/strong> USB-attached UPS devices<\/a>, and it&#8217;s not really pretty.  The gist of the process is as follows:<\/p>\n\n\n\n<ol><li>Configure udev rules to ensure a consistent mapping (by UPS serial number) to a named mount point<\/li><li>Create multiple <em>apcupsd<\/em> configuration files for each connected UPS<\/li><li>Create new &#8220;action&#8221; and &#8220;control&#8221; scripts for each UPS<\/li><li> Re-configure the <em>apcupsd<\/em> init.d\/systemd scripts to launch multiple instances of the daemon (one for each UPS) <\/li><\/ol>\n\n\n\n<p>I&#8217;m generally not a fan of creating large &#8220;custom&#8221; configuration files in obscure locations with great variance from the distributed package, so this process seemed a little &#8220;hackey&#8221; to me; especially since the end result of all of these configuration files was to have &#8220;isolated processes&#8221; for each UPS to monitor.<\/p>\n\n\n\n<h2>Dockerizing APCUPSD<\/h2>\n\n\n\n<p>At this point, I decided to take a different approach to isolating each <em>apcupsd<\/em> process: an approach with far greater discoverability, version-control potential, and scalability.  Docker.<\/p>\n\n\n\n<p>I decided to use the first step outlined in the <a href=\"https:\/\/wiki.debian.org\/apcupsd#Configuring_.28Multiple_UPS_Devices.29\"><em>apcupsd<\/em> guide on the Debian Wiki<\/a> (creating udev rules to ensure physical devices are given a persistent path on boot\/attach).  UPS devices are generally mounted at <code>\/dev\/usb\/hiddev*<\/code>, so we should confirm that we have a few present:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ls \/dev\/usb\nhiddev0  hiddev1\n\n# lsusb\nBus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\nBus 004 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply\nBus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub\nBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\nBus 003 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply\nBus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub<\/code><\/pre>\n\n\n\n<p>Great! we&#8217;ve got things that <strong>look like<\/strong> UPS devices on <code>\/dev\/usb\/hiddev0<\/code> and <code>\/dev\/usb\/hiddev1<\/code>.  Now to get the serialnumbers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># udevadm info --attribute-walk --name=\/dev\/usb\/hiddev0 | egrep 'manufacturer|product|serial'\n    ATTRS{manufacturer}==\"American Power Conversion\"\n    ATTRS{product}==\"Back-UPS BX1500G FW:866.L5 .D USB FW:L5 \"\n    ATTRS{serial}==\"8975309\"\n    ATTRS{manufacturer}==\"Linux 4.4.0-170-generic ohci_hcd\"\n    ATTRS{product}==\"OHCI PCI host controller\"\n    ATTRS{serial}==\"0000:00:02.0\"\n# udevadm info --attribute-walk --name=\/dev\/usb\/hiddev1 | egrep 'manufacturer|product|serial'\n    ATTRS{manufacturer}==\"American Power Conversion\"\n    ATTRS{product}==\"Back-UPS NS 1100M2 FW:953.e3 .D USB FW:e3     \"\n    ATTRS{serial}==\"8675310\"\n    ATTRS{manufacturer}==\"Linux 4.4.0-170-generic ohci_hcd\"\n    ATTRS{product}==\"OHCI PCI host controller\"\n    ATTRS{serial}==\"0000:00:04.0\"<\/code><\/pre>\n\n\n\n<p>With the now known serial numbers, we create udev rules to persist these devices to known map points:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>## FILE AT \/lib\/udev\/rules.d\/ups.rules\n\n# SCREEN UPS\nKERNEL==\"hiddev*\", ATTRS{manufacturer}==\"American Power Conversion\", ATTRS{serial}==\"8975309\", OWNER=\"root\", SYMLINK+=\"usb\/ups-screen\"\n\n# ComputeAndNetwork UPS\nKERNEL==\"hiddev*\", ATTRS{manufacturer}==\"American Power Conversion\", ATTRS{serial}==\"8675310\", OWNER=\"root\", SYMLINK+=\"usb\/ups-compute-and-network\"<\/code><\/pre>\n\n\n\n<p>And now to re-run the udev rules:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>udevadm trigger --verbose --sysname-match=hiddev*<\/code><\/pre>\n\n\n\n<p>Now, we should have some &#8220;nicely named&#8221; UPS USB devices:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ls -la \/dev\/usb\ntotal 0\ndrwxr-xr-x  2 root root    120 Dec 18 19:55 .\ndrwxr-xr-x 22 root root   4280 Dec 18 19:55 ..\ncrwxrwxrwx  1 root root 180, 0 Dec 18 19:55 hiddev0\ncrwxrwxrwx  1 root root 180, 1 Dec 18 19:55 hiddev1\nlrwxrwxrwx  1 root root      7 Dec 18 19:55 ups-compute-and-network -> hiddev1\nlrwxrwxrwx  1 root root      7 Dec 18 19:55 ups-screen -> hiddev0<\/code><\/pre>\n\n\n\n<p>Excellent!   Now, anytime these devices are plugged\/unplugged, we shouldn&#8217;t have to guess which is <code>hiddev0<\/code> and which is <code>hiddev1<\/code>, since udev will automagically provide us <strong>named mount points <\/strong>for these USB devices, which will be critical to the next steps<\/p>\n\n\n\n<p>Next, I created a <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/\"><code>docker-compose<\/code> file <\/a>with the <em>three<\/em> &#8220;services&#8221; I decided I&#8217;d like for this setup: <\/p>\n\n\n\n<ul><li>APCUPSD for the &#8220;screens&#8221; UPS<\/li><li>APCUPSD for the &#8220;Compute and Network&#8221; UPS<\/li><li>Apache\/Multimon to provide an HTTP based interface<\/li><\/ul>\n\n\n\n<p>This <code>docker-compose<\/code> file also contained pointers to specific <code><a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\">Dockerfiles<\/a><\/code> to actually build an image for each service (hint: the two <em>apcupsd<\/em> services use the same container with different configurations).<\/p>\n\n\n\n<p>The <em>apcupsd<\/em> container is nothing more than the latest Alpine linux image; <em>apcupsd<\/em> from the <em>apk<\/em> repository and a <strong>very lightweight<\/strong> <em>apcupsd<\/em> configuration files (configured to watch <em>only<\/em>the UPS at <code>\/dev\/ups<\/code> &#8211; more on this later)<\/p>\n\n\n\n<p>The <em>multimon<\/em> container uses the latest Apache\/alpine image, and adds <em>apcupsd-webif<\/em> from the<em> apk <\/em>repository along with a few configuration files for <em>multimon.<\/em>  Additionally, I wrote an <em>entrypoint.sh<\/em> script to parse environment variables and generate a configuration file for <em>multimon<\/em> so that the UPS(s) displayed on the web interface can be set from the <code>docker-compose<\/code> file.<\/p>\n\n\n\n<p>Having now covered the build process, let&#8217;s put together the <code>docker-compose<\/code> services: <\/p>\n\n\n\n<ul><li>APCUPSD image as a container with a <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/#devices\">device mapping<\/a> for <code>ups-compute-and-network<\/code> on the host to <code>\/dev\/ups<\/code> in the container<\/li><li> APCUPSD image as a container with a <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/#devices\">device mapping<\/a> for <code>ups-screen<\/code> on the host to <code>\/dev\/ups<\/code> in the container <\/li><li>Multimon with an environment variable containing the <code>docker-compose<\/code> service names of the two APCUPSD instances (<a href=\"https:\/\/docs.docker.com\/compose\/networking\/\"><code>docker-compose<\/code> services are <strong>discoverable by DNS name within a composed network<\/strong><\/a>)<\/li><\/ul>\n\n\n\n<p>Full Docker setup here: <a href=\"https:\/\/github.com\/crossan007\/APCUPSD-Multimon-Docker\">https:\/\/github.com\/crossan007\/APCUPSD-Multimon-Docker<\/a> <\/p>\n\n\n\n<p>Now, instead of attempting to create custom <code>init<\/code> scripts, multiplex processes within systemd, and override the packaged mechanisms for <em>apcupsd<\/em>&#8216;s configuration discovery, I instead have a <strong>cleanly defined<\/strong> interface for isolating instances of <em>apcupsd<\/em> to provide a status page for my two APC UPS devices.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"967\" height=\"177\" src=\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png\" alt=\"\" class=\"wp-image-701\" srcset=\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png 967w, https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image-300x55.png 300w, https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image-768x141.png 768w\" sizes=\"(max-width: 967px) 100vw, 967px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"787\" height=\"581\" src=\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image-1.png\" alt=\"\" class=\"wp-image-702\" srcset=\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image-1.png 787w, https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image-1-300x221.png 300w, https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image-1-768x567.png 768w\" sizes=\"(max-width: 787px) 100vw, 787px\" \/><\/figure>\n\n\n\n<p>Thanks for reading, and hopefully this helps you in some way!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As any proper IT-nerd would agree, UPS devices are critical pieces of equipment not only in the data center, but also at home. However, most home users are not in a position to acquire a massive 10+ kilovolt-amp UPS capable of protecting all circuits by which our various &#8220;personal devices&#8221; are powered; rather, most home\/small &hellip; <a href=\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Configuring Multiple Networked OR USB APC UPS devices<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[138,53],"tags":[272,275,221,25,276,274,273],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configuring Multiple Networked OR USB APC UPS devices - Charles&#039; Blog\" \/>\n<meta property=\"og:description\" content=\"As any proper IT-nerd would agree, UPS devices are critical pieces of equipment not only in the data center, but also at home. However, most home users are not in a position to acquire a massive 10+ kilovolt-amp UPS capable of protecting all circuits by which our various &#8220;personal devices&#8221; are powered; rather, most home\/small &hellip; Continue reading Configuring Multiple Networked OR USB APC UPS devices &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/\" \/>\n<meta property=\"og:site_name\" content=\"Charles&#039; Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-19T14:01:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-02-10T20:03:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"crossan007\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/crossan007.dev\/blog\/#website\",\"url\":\"https:\/\/crossan007.dev\/blog\/\",\"name\":\"Charles&#039; Blog\",\"description\":\"SharePoint | PowerShell | Exchange | SCCM | Ubuntu | PHP | JavaScript | A\/V Live Production | More...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/crossan007.dev\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png\",\"contentUrl\":\"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png\",\"width\":967,\"height\":177},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#webpage\",\"url\":\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/\",\"name\":\"Configuring Multiple Networked OR USB APC UPS devices - Charles&#039; Blog\",\"isPartOf\":{\"@id\":\"https:\/\/crossan007.dev\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#primaryimage\"},\"datePublished\":\"2019-12-19T14:01:46+00:00\",\"dateModified\":\"2020-02-10T20:03:57+00:00\",\"author\":{\"@id\":\"https:\/\/crossan007.dev\/blog\/#\/schema\/person\/bd99569cd81332c8fd866d023848b979\"},\"breadcrumb\":{\"@id\":\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/crossan007.dev\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configuring Multiple Networked OR USB APC UPS devices\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/crossan007.dev\/blog\/#\/schema\/person\/bd99569cd81332c8fd866d023848b979\",\"name\":\"crossan007\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/crossan007.dev\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/fff72c74fb6a0da29accf0db83ad4b4b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/fff72c74fb6a0da29accf0db83ad4b4b?s=96&d=mm&r=g\",\"caption\":\"crossan007\"},\"url\":\"https:\/\/crossan007.dev\/blog\/author\/crossan007\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/","og_locale":"en_US","og_type":"article","og_title":"Configuring Multiple Networked OR USB APC UPS devices - Charles&#039; Blog","og_description":"As any proper IT-nerd would agree, UPS devices are critical pieces of equipment not only in the data center, but also at home. However, most home users are not in a position to acquire a massive 10+ kilovolt-amp UPS capable of protecting all circuits by which our various &#8220;personal devices&#8221; are powered; rather, most home\/small &hellip; Continue reading Configuring Multiple Networked OR USB APC UPS devices &rarr;","og_url":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/","og_site_name":"Charles&#039; Blog","article_published_time":"2019-12-19T14:01:46+00:00","article_modified_time":"2020-02-10T20:03:57+00:00","og_image":[{"url":"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png"}],"twitter_misc":{"Written by":"crossan007","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/crossan007.dev\/blog\/#website","url":"https:\/\/crossan007.dev\/blog\/","name":"Charles&#039; Blog","description":"SharePoint | PowerShell | Exchange | SCCM | Ubuntu | PHP | JavaScript | A\/V Live Production | More...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/crossan007.dev\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"ImageObject","@id":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#primaryimage","inLanguage":"en-US","url":"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png","contentUrl":"https:\/\/crossan007.dev\/blog\/wp-content\/uploads\/2019\/12\/image.png","width":967,"height":177},{"@type":"WebPage","@id":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#webpage","url":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/","name":"Configuring Multiple Networked OR USB APC UPS devices - Charles&#039; Blog","isPartOf":{"@id":"https:\/\/crossan007.dev\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#primaryimage"},"datePublished":"2019-12-19T14:01:46+00:00","dateModified":"2020-02-10T20:03:57+00:00","author":{"@id":"https:\/\/crossan007.dev\/blog\/#\/schema\/person\/bd99569cd81332c8fd866d023848b979"},"breadcrumb":{"@id":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/crossan007.dev\/blog\/linux\/configuring-multiple-networked-apc-ups-devices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/crossan007.dev\/blog\/"},{"@type":"ListItem","position":2,"name":"Configuring Multiple Networked OR USB APC UPS devices"}]},{"@type":"Person","@id":"https:\/\/crossan007.dev\/blog\/#\/schema\/person\/bd99569cd81332c8fd866d023848b979","name":"crossan007","image":{"@type":"ImageObject","@id":"https:\/\/crossan007.dev\/blog\/#personlogo","inLanguage":"en-US","url":"https:\/\/secure.gravatar.com\/avatar\/fff72c74fb6a0da29accf0db83ad4b4b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fff72c74fb6a0da29accf0db83ad4b4b?s=96&d=mm&r=g","caption":"crossan007"},"url":"https:\/\/crossan007.dev\/blog\/author\/crossan007\/"}]}},"_links":{"self":[{"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/posts\/693"}],"collection":[{"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/comments?post=693"}],"version-history":[{"count":9,"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/posts\/693\/revisions"}],"predecessor-version":[{"id":704,"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/posts\/693\/revisions\/704"}],"wp:attachment":[{"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/media?parent=693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/categories?post=693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crossan007.dev\/blog\/wp-json\/wp\/v2\/tags?post=693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}