{"id":775,"date":"2013-09-26T13:18:55","date_gmt":"2013-09-26T11:18:55","guid":{"rendered":"http:\/\/willem.aandewiel.nl\/?p=775"},"modified":"2018-12-19T15:36:46","modified_gmt":"2018-12-19T14:36:46","slug":"shutdown-headless-raspberry-pi-english","status":"publish","type":"post","link":"https:\/\/willem.aandewiel.nl\/index.php\/2013\/09\/26\/shutdown-headless-raspberry-pi-english\/","title":{"rendered":"Shutdown Headless Raspberry Pi (English)"},"content":{"rendered":"<p><!-- Plaatje Productie --><br \/>\n<a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Ready4Prod.jpg\"><img decoding=\"async\" class=\"alignleft size-full wp-image-216\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Ready4Prod.jpg\" alt=\"Ready4Prod\" width=\"150\" \/><\/a><br \/>\n<!-- Inleidende tekst --><br \/>\nA modern operating system does not like being turned off on a dime, that is to say, being turned off before being shut down. For computers with a graphic interface this is as easy as pressing the right button. However, if a computer doesn&#8217;t have a screen or a mouse, like a Raspberry Pi (RPi) working as a server hidden away in a dark corner, this offers some difficulty. The only way to shut it down is by logging in through SSH and running the \u201cshutdown -h now\u201d command.<br \/>\nEen Nederlandse vertaling vindt u <a title=\"Shutdown Headless Raspberry Pi\" href=\"http:\/\/willem.aandewiel.nl\/index.php\/shutdown-headless-raspberry-pi\/\">hier<\/a>.<br \/>\n<!--more--><br \/>\nIn this post I will explain a way to use software, two buttons, four resistors and one LED to shutdown or reset the RPi neatly.<br \/>\nFor this project I will use two General Purpose Input\/Output (GPIO) ports on the RPi. These ports can be programmed as either Input \u00f3r an Outpot port. The RPi has several of these ports. These are found on the P1 connector, but there are also four ports on the Rev2 board at the P5 connector. The P5 connector needs to be soldered to the RPi. Because I plan on using the P1 connector for other purposes, I have chosen to use the P5 connector. If you want to use another port, you can change the software to select which GPIO port you want to use.<br \/>\n<!-- RPI met lijnen om P1, P5 en P6 --><br \/>\n<a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/RaspberryPi.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-717\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/RaspberryPi.jpg\" alt=\"RaspberryPi\" width=\"2872\" height=\"2044\" \/><\/a><br \/>\nOn the Rev2 boards of the RPi there is space for a connector which can be used to reset the RPi or to start the RPi after a \u201cshutdown -h now\u201d command. To do this, you need to solder a P6 connector on the RPi. By making pin 1 (the square on the illustration) \u201clow\u201d (connecting it with earth) the RPi will boot again.<br \/>\n<!-- Basis gebruik GPIO poort --><br \/>\n<a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/GPIO_IN.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-681\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/GPIO_IN.jpg\" alt=\"GPIO_IN\" width=\"320\" height=\"240\" \/><\/a><br \/>\nThere are two ways to connect a switch to a GPIO defined as an input. In the example on the left the rest state for a GPIO port is set to \u201chigh\u201d (+3V3). This is because the 10K ohm resistor draws the port to +3V3 (called a Pull-Up resistance). When the switch is pushed, the port changes to \u201clow\u201d (GND). The extra resistor in serie with the GPIO is not necessary, but it prevents a GPIO port which is defined as an output from burning down.<br \/>\nIn the example on the right the rest state of the GPIO port is set to \u201clow\u201d (or GND, 0V). This is because of the resistor of 10K ohm pulls the port to GND (this is called the Pull-Down resistor). When the switch is pressed, the port becomes \u201chigh\u201d (+3V3). In this example the extra resistor helps as a security barrier in case the port is defined as Output.<br \/>\n<!-- Schema zonder LED --><br \/>\n<a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Schema01.jpg\"><img decoding=\"async\" class=\"alignleft size-full wp-image-692\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Schema01.jpg\" alt=\"Schema01\" width=\"300\" \/><\/a><br \/>\nThe schematic on the left shows how the RPi, with the use of some software, can be shutdown neatly. For me, the label \u201cDO NOT PRESS\u201d makes me curious to do the opposite. That is why I linked the reset button in series with the shutdown button and set the GPIO-Input in rest state to \u201chigh\u201d. Pin 1 of P6 becomes \u201clow\u201d only when both buttons are pushed at the same time.<br \/>\n<!-- Ticks Tellen --><br \/>\nBecause you don&#8217;t want the RPi to shutdown when the button is pushed by accident, this command is triggered at a delay which can be changed with the software (standard is between four and six seconds).<br \/>\n<!-- Plaatje Testopstelling, zonder LED --><br \/>\n<a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Test01a.jpg\"><img decoding=\"async\" class=\"alignright size-full wp-image-694\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Test01a.jpg\" alt=\"Test01a\" width=\"200\" \/><\/a><br \/>\nWhen testing these schematics I noticed that the lack of feedback is not helpful. By adding a LED &#8211;which is triggered via software&#8211; in to the chain it becomes possible to see the current state of the program. When software is running the LED flashes once every two seconds. When the shutdown button is pressed, the frequency changes to four times per second. When the LED start to emit constant, the shutdown command is executed.<br \/>\n<!-- definitief schema --><br \/>\nThis is the definitive schematic:<br \/>\n<a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/10\/GPIOshutdown.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-788\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/10\/GPIOshutdown.png\" alt=\"Complete Schematic\" width=\"720\" \/><\/a><br \/>\nI soldered the different components onto a PCB-board in such a way that the print falls exactly over the pins of P5 and P6.<br \/>\n<!-- Plaatjes printje --><\/p>\n<table>\n<tbody>\n<tr valign=\"top\">\n<td valign=\"top\"><a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Proto01b.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-685\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Proto01b.jpg\" alt=\"Proto01b\" width=\"145\" \/><\/a><\/td>\n<td valign=\"top\"><a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Proto01a.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-684\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Proto01a.jpg\" alt=\"Proto01a\" width=\"145\" \/><\/a><\/td>\n<td valign=\"top\"><a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Ready2Test2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-688\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Ready2Test2.jpg\" alt=\"Ready2Test2\" width=\"145\" \/><\/a><\/td>\n<td valign=\"top\"><a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Ready2Test1.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-687\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Ready2Test1.jpg\" alt=\"Ready2Test1\" width=\"145\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This is the code to control the GPIO port&#8217;s:<\/p>\n<pre class=\"lang:sh decode:true Title='GPIOshutdown.sh'\">#!\/bin\/sh\r\n#-----------------------#\r\n#    GPIOshutdown.sh    #\r\n#-----------------------#\r\nBASENAME=<code data-enlighter-language=\"raw\" class=\"EnlighterJSRAW\">basename ${0}<\/code>\r\nPIDFILE=\"\/var\/run\/${BASENAME%.sh}.pid\"\r\nif [ -f ${PIDFILE} ]; then\r\n    echo \"${BASENAME} allready running...\"\r\n    exit\r\nelse\r\n    echo ${$} &gt; ${PIDFILE}\r\nfi\r\n#\r\n# GPIO numbers should be from this list (P1)\r\n# 0, 1, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 21, 22, 23, 24, 25\r\n#\r\n# GPIO numbers should be from this list (P5)\r\n# 29, 31\r\n#\r\n# Note that the GPIO numbers that you program here refer to the pins\r\n# of the BCM2835 and *not* the numbers on the pin header.\r\n# So, if you want to activate GPIO7 on the header you should be\r\n# using GPIO4 in this script. Likewise if you want to activate GPIO0\r\n# on the header you should be using GPIO17 here.\r\n#\r\nGPIO_IN=29        # Input - change it into the port you want to use\r\nGPIO_LED=31       # Ouput - GPIO29 = P5-04, GPIO31 = P5-06\r\n#\r\n# Set up GPIO_IN and set to Input\r\necho \"${GPIO_IN}\" &gt; \/sys\/class\/gpio\/export\r\necho \"in\" &gt; \/sys\/class\/gpio\/gpio${GPIO_IN}\/direction\r\n#\r\n# test of input hoog is, anders is er niets op\r\n# deze GPIO_IN aangesloten...\r\nI=0\r\nSW=<code data-enlighter-language=\"raw\" class=\"EnlighterJSRAW\">cat \/sys\/class\/gpio\/gpio${GPIO_IN}\/value<\/code>\r\necho \"value GPIO_${GPIO_IN} is [${SW}]\"\r\nwhile [ ${SW} -eq 0 ];\r\ndo\r\n    I=$((I+1))\r\n    if [ ${I} -gt 10 ]; then\r\n        echo \"..pfff\"\r\n        echo \"GPIO_${GPIO_IN} niet aangesloten\"\r\n        rm -f ${PIDFILE}\r\n        exit\r\n    fi\r\n    SW=<code data-enlighter-language=\"raw\" class=\"EnlighterJSRAW\">cat \/sys\/class\/gpio\/gpio${GPIO_IN}\/value<\/code>\r\n    echo -n \"${I}\"\r\n    sleep 1\r\ndone\r\n#\r\n# Set up GPIO_LED and set to output\r\necho \"${GPIO_LED}\" &gt; \/sys\/class\/gpio\/export\r\necho \"out\" &gt; \/sys\/class\/gpio\/gpio${GPIO_LED}\/direction\r\n#\r\nI=0        # Duur van de KeyPress (Ticks-Teller)\r\nLED=0      # LED Aan=1, Uit=0\r\nS=2        # Seconden sleep\r\nwhile true\r\ndo\r\n    sleep ${S}\r\n    #\r\n    if [ ${LED} -eq 1 ]; then\r\n        echo \"0\" &gt; \/sys\/class\/gpio\/gpio${GPIO_LED}\/value\r\n        LED=0\r\n    else\r\n        echo \"1\" &gt; \/sys\/class\/gpio\/gpio${GPIO_LED}\/value\r\n        LED=1\r\n    fi\r\n    #\r\n    SW=<code data-enlighter-language=\"raw\" class=\"EnlighterJSRAW\">cat \/sys\/class\/gpio\/gpio${GPIO_IN}\/value<\/code>\r\n    if [ ${SW} -eq 0 ]\r\n    then\r\n        I=$((I+1))    # Tel het aantal Ticks dat de Key is ingedrukt\r\n        S=0.25        # KeyPress, dan 0.25 seconden sleep\r\n        echo -n \"${I}\"\r\n        if [ ${I} -gt 16 ]\r\n        then\r\n            echo \"...\"\r\n            echo \"Key pressed  for [${I}] ticks..\"\r\n            I=0\r\n            echo \"1\" &gt; \/sys\/class\/gpio\/gpio${GPIO_LED}\/value\r\n            # Clean up\r\n            echo \"${GPIO_IN}\" &gt; \/sys\/class\/gpio\/unexport\r\n            echo \"\/sbin\/shutdown -h now\"    # Gebruik dit om te testen\r\n#           \/sbin\/shutdown -h now           # Gebruik dit voor productie\r\n            rm -f ${PIDFILE}                # Verwijder PID file\r\n            sleep 5                         # Settle down..\r\n            exit\r\n        fi\r\n    else\r\n        I=0        # Toets is weer los gelaten, reset Ticks Teller\r\n        S=2        # Sleep weer op 2 seconden zetten\r\n    fi\r\ndone\r\n#\r\necho \"0\" &gt; \/sys\/class\/gpio\/gpio${GPIO_LED}\/value\r\n#\r\n# Clean up\r\necho \"${GPIO_IN}\" &gt; \/sys\/class\/gpio\/unexport\r\n#echo \"${GPIO_LED}\" &gt; \/sys\/class\/gpio\/unexport\r\n#\r\necho \"Done....\"\r\n#\r\n<\/pre>\n<p>Paste this code in to \u201c\/usr\/local\/bin\/GPIOshutdown.sh\u201d and then<br \/>\n<b><code>sudo chmod +x \/usr\/local\/bin\/GPIOshutdown.sh<\/code><\/b><br \/>\nTo run the program automatically when the RPi starts you have several options. I like running the program as &#8216;daemon&#8217;. If you want to run the program as daemon as well, paste the following code into a file called \u201c\/etc\/init.d\/GPIOshutdown\u201d:<\/p>\n<pre class=\"lang:sh decode:true \">#! \/bin\/sh\r\n### BEGIN INIT INFO\r\n# Provides:          GPIOshutdown\r\n# Required-Start:    $remote_fs $syslog\r\n# Required-Stop:     $remote_fs $syslog\r\n# Default-Start:     2 3 4 5\r\n# Default-Stop:      0 1 6\r\n# Short-Description: check if GPIO29 is low and shutdown the system\r\n# Description:       check if GPIO29 is low and shutdown the system\r\n#                    bla bla bla\r\n### END INIT INFO\r\n# Author: Willem Aandewiel (Willem@Aandewiel.nl)\r\n#\r\n# Do NOT \"set -e\"\r\n# PATH should only include \/usr\/* if it runs after the mountnfs.sh script\r\nPATH=\/sbin:\/usr\/sbin:\/bin:\/usr\/bin\r\nDESC=\"check GPIO input for LOW and halt the system\"\r\nNAME=GPIOshutdown\r\nDAEMON=\/usr\/local\/bin\/${NAME}.sh\r\nDAEMON_ARGS=\"\"\r\nPIDFILE=\/var\/run\/$NAME.pid\r\nSCRIPTNAME=\/etc\/init.d\/$NAME\r\n# Exit if the package is not installed\r\n[ -x \"$DAEMON\" ] || exit 0\r\n# Read configuration variable file if it is present\r\n[ -r \/etc\/default\/$NAME ] &amp;&amp; . \/etc\/default\/$NAME\r\n# Load the VERBOSE setting and other rcS variables\r\n. \/lib\/init\/vars.sh\r\n# Define LSB log_* functions.\r\n# Depend on lsb-base (&gt;= 3.2-14) to ensure that this file is present\r\n# and status_of_proc is working.\r\n. \/lib\/lsb\/init-functions\r\n#\r\n# Function that starts the daemon\/service\r\n#\r\ndo_start()\r\n{\r\n    # Return\r\n    #   0 if daemon has been started\r\n    #   1 if daemon was already running\r\n    #   2 if daemon could not be started\r\n    start-stop-daemon --start --quiet --background --pidfile $PIDFILE --nicelevel 19 --exec $DAEMON --test &gt; \/dev\/null \\\r\n        || return 1\r\n    start-stop-daemon --start --quiet --background --pidfile $PIDFILE --nicelevel 19 --exec $DAEMON -- \\\r\n        || return 2\r\n    # Add code here, if necessary, that waits for the process to be ready\r\n    # to handle requests from services started subsequently which depend\r\n    # on this one.  As a last resort, sleep for some time.\r\n}\r\n#\r\n# Function that stops the daemon\/service\r\n#\r\ndo_stop()\r\n{\r\n    # Return\r\n    #   0 if daemon has been stopped\r\n    #   1 if daemon was already stopped\r\n    #   2 if daemon could not be stopped\r\n    #   other if a failure occurred\r\n    start-stop-daemon --stop --quiet --retry=TERM\/30\/KILL\/5 --pidfile $PIDFILE --name $NAME\r\n    RETVAL=\"$?\"\r\n    [ \"$RETVAL\" = 2 ] &amp;&amp; return 2\r\n    # Wait for children to finish too if this is a daemon that forks\r\n    # and if the daemon is only ever run from this initscript.\r\n    # If the above conditions are not satisfied then add some other code\r\n    # that waits for the process to drop all resources that could be\r\n    # needed by services started subsequently.  A last resort is to\r\n    # sleep for some time.\r\n    start-stop-daemon --stop --quiet --oknodo --retry=0\/30\/KILL\/5 --exec $DAEMON\r\n    [ \"$?\" = 2 ] &amp;&amp; return 2\r\n    # Many daemons don't delete their pidfiles when they exit.\r\n    rm -f $PIDFILE\r\n    return \"$RETVAL\"\r\n}\r\ncase \"$1\" in\r\n  start)\r\n    [ \"$VERBOSE\" != no ] &amp;&amp; log_daemon_msg \"Starting $DESC\" \"$NAME\"\r\n    do_start\r\n    case \"$?\" in\r\n        0|1) [ \"$VERBOSE\" != no ] &amp;&amp; log_end_msg 0 ;;\r\n        2) [ \"$VERBOSE\" != no ] &amp;&amp; log_end_msg 1 ;;\r\n    esac\r\n    ;;\r\n  stop)\r\n    [ \"$VERBOSE\" != no ] &amp;&amp; log_daemon_msg \"Stopping $DESC\" \"$NAME\"\r\n    do_stop\r\n    case \"$?\" in\r\n        0|1) [ \"$VERBOSE\" != no ] &amp;&amp; log_end_msg 0 ;;\r\n        2) [ \"$VERBOSE\" != no ] &amp;&amp; log_end_msg 1 ;;\r\n    esac\r\n    ;;\r\n  status)\r\n    status_of_proc \"$DAEMON\" \"$NAME\" &amp;&amp; exit 0 || exit $?\r\n    ;;\r\n  restart)\r\n    #\r\n    # If the \"reload\" option is implemented then remove the\r\n    # 'force-reload' alias\r\n    #\r\n    log_daemon_msg \"Restarting $DESC\" \"$NAME\"\r\n    do_stop\r\n    case \"$?\" in\r\n      0|1)\r\n        do_start\r\n        case \"$?\" in\r\n            0) log_end_msg 0 ;;\r\n            1) log_end_msg 1 ;; # Old process is still running\r\n            *) log_end_msg 1 ;; # Failed to start\r\n        esac\r\n        ;;\r\n      *)\r\n        # Failed to stop\r\n        log_end_msg 1\r\n        ;;\r\n    esac\r\n    ;;\r\n  *)\r\n    echo \"Usage: $SCRIPTNAME {start|stop|status|restart}\" &gt;&amp;2\r\n    exit 3\r\n    ;;\r\nesac\r\n:\r\n<\/pre>\n<p>Don&#8217;t forget to<br \/>\n<b><code>sudo chmod +x \/etc\/init.d\/GPIOshutdown<\/code><\/b><br \/>\nTo start the daemon type:<br \/>\n<b><code>sudo \/etc\/init.d\/GPIOshutdown start<\/code><\/b><br \/>\nThe LED starts blinking.<br \/>\nTo stop the daemon type the commando:<br \/>\n<b><code>sudo \/etc\/init.d\/GPIOshutdown stop<\/code><\/b><br \/>\nThe LED turns off.<br \/>\nTo start the daemon automatically with every reboot of RPi, you have to install the service with the command:<br \/>\n<b><code>cd \/etc\/init.d<br \/>\nsudo insserv GPIOshutdown<\/code><\/b><br \/>\nRest assured that the script does not take up too much of the available processor capacity. When the &#8216;sleep&#8217; command is ran, it uses almost no processor time.<br \/>\nPlease Note: the P5 connector is meant to be soldered to the bottom of the RPi. Because I found this inconvenient for this particular project, I soldered it to the top (component side). Because of this, the Pin numbers are in the wrong order. The squares on the RPi-board always mark pin 1.<br \/>\nI only used the even pin-numbers where the +3V3 is on the outside of the RPi.<\/p>\n<table>\n<tbody>\n<tr valign=\"top\">\n<td valign=\"top\"><a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/P5_Header.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-738\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/P5_Header.jpg\" alt=\"P5_Header\" width=\"199\" height=\"253\" \/><\/a><\/td>\n<td valign=\"top\"><a href=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/P1_Header.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-737\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/P1_Header.jpg\" alt=\"P1_Header\" width=\"327\" height=\"154\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><img decoding=\"async\" class=\"alignright size-full wp-image-696\" src=\"http:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2013\/09\/Test02a.jpg\" alt=\"Test02a\" width=\"720\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A modern operating system does not like being turned off on a dime, that is to say, being turned off before being shut down. For computers with a graphic interface this is as easy as pressing the right button. However, &hellip; <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2013\/09\/26\/shutdown-headless-raspberry-pi-english\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,15],"tags":[84],"class_list":["post-775","post","type-post","status-publish","format-standard","hentry","category-computer","category-scripts","tag-raspberry-pi"],"views":4946,"_links":{"self":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/comments?post=775"}],"version-history":[{"count":0,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/775\/revisions"}],"wp:attachment":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/media?parent=775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/categories?post=775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/tags?post=775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}