{"id":2951,"date":"2025-07-26T16:44:45","date_gmt":"2025-07-26T15:44:45","guid":{"rendered":"https:\/\/workboot.fr\/ciela\/?page_id=2951"},"modified":"2025-07-29T09:41:06","modified_gmt":"2025-07-29T08:41:06","slug":"libgpiod","status":"publish","type":"page","link":"https:\/\/workboot.fr\/ciela\/libgpiod\/","title":{"rendered":"libgpiod"},"content":{"rendered":"\n<nav aria-label=\"Table des mati\u00e8res\" class=\"wp-block-table-of-contents\"><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#presentation\">Pr\u00e9sentation:<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#installation\">installation<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#pourquoi-libgpiod\">Pourquoi libgpiod ?<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#outils-principaux\">Outils principaux<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#gpiodetect\">gpiodetect<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#gpioinfo\">gpioinfo<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#gpioget\">gpioget<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#gpioset\">gpioset<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#gpiofind\">gpiofind<\/a><\/li><\/ol><\/li><\/ol><\/li><\/ol><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#utilisation-du-langage-c\">Utilisation du langage C<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#installation-de-la-lib-et-de-la-doc\">installation de la lib et de la doc<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#structure-de-base-d-un-programme-c\">Structure de Base d&rsquo;un Programme c<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#controle-des-gpio\">Contr\u00f4le des GPIO<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#configurer-une-sortie-led\">Configurer une sortie (LED)<\/a><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#lire-une-entree-bouton-ils\">Lire une entr\u00e9e (Bouton\/ILS)<\/a><\/li><\/ol><\/li><\/ol><\/li><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#exemple-en-c\">Exemple en C<\/a><ol><li><a class=\"wp-block-table-of-contents__entry\" href=\"https:\/\/workboot.fr\/ciela\/libgpiod\/#compiler-le-code-c\">Compiler le code c<\/a><\/li><\/ol><\/li><\/ol><\/nav>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"presentation\">Pr\u00e9sentation:<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>libgpiod<\/strong>&nbsp;est une biblioth\u00e8que et un ensemble d&rsquo;outils en mode utilisateur (<em>userspace<\/em>) pour interagir avec les GPIO (General Purpose Input\/Output) sur les syst\u00e8mes Linux, en particulier ceux utilisant l&rsquo;interface&nbsp;<strong>GPIO character device<\/strong>&nbsp;(introduite avec le noyau Linux 4.8).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation\">installation<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install gpiod libgpiod-dev libgpiod-doc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">il faut appartenir au groupe gpio <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo usermod -aG gpio $USER<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pourquoi-libgpiod\">Pourquoi libgpiod ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avant, les GPIO \u00e9taient souvent contr\u00f4l\u00e9s via l&rsquo;interface obsol\u00e8te&nbsp;<strong>\/sys\/class\/gpio<\/strong>&nbsp;(sysfs), qui avait plusieurs limitations :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pas de gestion propre des conflits d&rsquo;acc\u00e8s.<\/li>\n\n\n\n<li>Pas de contr\u00f4le fin des \u00e9v\u00e9nements (interruptions).<\/li>\n\n\n\n<li>Probl\u00e8mes de performances et de s\u00e9curit\u00e9.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>libgpiod<\/strong>&nbsp;offre une alternative moderne et robuste, avec :<br>\u2705 Une API C bien d\u00e9finie (<code>libgpiod<\/code>).<br>\u2705 Des outils en ligne de commande (<code>gpiodetect<\/code>,&nbsp;<code>gpioinfo<\/code>,&nbsp;<code>gpioget<\/code>,&nbsp;<code>gpioset<\/code>, etc.).<br>\u2705 La prise en charge des interruptions GPIO (polling et \u00e9v\u00e9nements).<br>\u2705 Une meilleure gestion des droits (via&nbsp;<code>\/dev\/gpiochip*<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"outils-principaux\">Outils principaux<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>gpiodetect<\/code><\/strong>&nbsp;: Liste les contr\u00f4leurs GPIO disponibles (<code>\/dev\/gpiochip0<\/code>,&nbsp;<code>\/dev\/gpiochip1<\/code>, etc.).<\/li>\n\n\n\n<li><strong><code>gpioinfo<\/code><\/strong>&nbsp;: Affiche les lignes GPIO d&rsquo;un contr\u00f4leur (num\u00e9ros, directions, \u00e9tats).<\/li>\n\n\n\n<li><strong><code>gpioget<\/code><\/strong>&nbsp;: Lit l&rsquo;\u00e9tat d&rsquo;une ou plusieurs GPIO.<\/li>\n\n\n\n<li><strong><code>gpioset<\/code><\/strong>&nbsp;: Modifie l&rsquo;\u00e9tat d&rsquo;une GPIO (avec options de dur\u00e9e, mode push-pull\/open-drain).<\/li>\n\n\n\n<li><strong><code>gpiomon<\/code><\/strong>&nbsp;: Surveille les changements d&rsquo;\u00e9tat (interruptions).<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"gpiodetect\">gpiodetect<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bruno@rpi364:~\/Works\/gpiomonitor $ gpiodetect<br>gpiochip0 &#91;pinctrl-bcm2835] (54 lines)<br>gpiochip1 &#91;raspberrypi-exp-gpio] (8 lines)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">il y a 2 puces pour les GPIO sur notre RPI <\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"gpioinfo\">gpioinfo<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">va lister les \u00e9tats des GPIO et le d\u00e9tail par puce (chip)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">on peut v\u00e9rifier les lignes utilis\u00e9es et les libres, par exemple 17 et 27 unused<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>gpioinfo<\/summary>\n<pre class=\"wp-block-code\"><code>gpiochip0 - 54 lines:\n        line   0:     \"ID_SDA\"       unused   input  active-high \n        line   1:     \"ID_SCL\"       unused   input  active-high \n        line   2:       \"SDA1\"       unused   input  active-high \n        line   3:       \"SCL1\"       unused   input  active-high \n        line   4:  \"GPIO_GCLK\"       unused   input  active-high \n        line   5:      \"GPIO5\"       unused   input  active-high \n        line   6:      \"GPIO6\"       unused   input  active-high \n        line   7:  \"SPI_CE1_N\"       unused   input  active-high \n        line   8:  \"SPI_CE0_N\"       unused   input  active-high \n        line   9:   \"SPI_MISO\"       unused   input  active-high \n        line  10:   \"SPI_MOSI\"       unused   input  active-high \n        line  11:   \"SPI_SCLK\"       unused   input  active-high \n        line  12:     \"GPIO12\"       unused   input  active-high \n        line  13:     \"GPIO13\"       unused   input  active-high \n        line  14:       \"TXD1\" \"gpio-fan@0\"  output  active-high &#91;used]\n        line  15:       \"RXD1\"       unused   input  active-high \n        line  16:     \"GPIO16\"       unused   input  active-high \n        line  17:     \"GPIO17\"       unused  output  active-high \n        line  18:     \"GPIO18\"       unused   input  active-high \n        line  19:     \"GPIO19\"       unused   input  active-high \n        line  20:     \"GPIO20\"       unused   input  active-high \n        line  21:     \"GPIO21\"       unused   input  active-high \n        line  22:     \"GPIO22\"       unused   input  active-high \n        line  23:     \"GPIO23\"       unused   input  active-high \n        line  24:     \"GPIO24\"       unused   input  active-high \n        line  25:     \"GPIO25\"       unused   input  active-high \n        line  26:     \"GPIO26\"       unused   input  active-high \n        line  27:     \"GPIO27\"       unused   input  active-high \n        line  28: \"HDMI_HPD_N\"        \"hpd\"   input   active-low &#91;used]\n        line  29: \"STATUS_LED_G\" \"ACT\" output active-high &#91;used]\n        line  30:       \"CTS0\"       unused   input  active-high \n        line  31:       \"RTS0\"       unused   input  active-high \n        line  32:       \"TXD0\"       unused   input  active-high \n        line  33:       \"RXD0\"       unused   input  active-high \n        line  34:    \"SD1_CLK\"       unused   input  active-high \n        line  35:    \"SD1_CMD\"       unused   input  active-high \n        line  36:  \"SD1_DATA0\"       unused   input  active-high \n        line  37:  \"SD1_DATA1\"       unused   input  active-high \n        line  38:  \"SD1_DATA2\"       unused   input  active-high \n        line  39:  \"SD1_DATA3\"       unused   input  active-high \n        line  40:   \"PWM0_OUT\"       unused   input  active-high \n        line  41:   \"PWM1_OUT\"       unused   input  active-high \n        line  42:    \"ETH_CLK\"       unused   input  active-high \n        line  43:   \"WIFI_CLK\"       unused   input  active-high \n        line  44:       \"SDA0\"       unused   input  active-high \n        line  45:       \"SCL0\"       unused   input  active-high \n        line  46:   \"SMPS_SCL\"       unused   input  active-high \n        line  47:   \"SMPS_SDA\"       unused  output  active-high \n        line  48:   \"SD_CLK_R\"       unused   input  active-high \n        line  49:   \"SD_CMD_R\"       unused   input  active-high \n        line  50: \"SD_DATA0_R\"       unused   input  active-high \n        line  51: \"SD_DATA1_R\"       unused   input  active-high \n        line  52: \"SD_DATA2_R\"       unused   input  active-high \n        line  53: \"SD_DATA3_R\"       unused   input  active-high \ngpiochip1 - 8 lines:\n        line   0:      \"BT_ON\"   \"shutdown\"  output  active-high &#91;used]\n        line   1:      \"WL_ON\"       unused  output  active-high \n        line   2:  \"PWR_LED_R\"        \"PWR\"  output   active-low &#91;used]\n        line   3:    \"LAN_RUN\"       unused  output  active-high \n        line   4:         \"NC\"       unused   input  active-high \n        line   5:  \"CAM_GPIO0\" \"cam1_regulator\" output active-high &#91;used]\n        line   6:  \"CAM_GPIO1\"       unused  output  active-high \n        line   7:         \"NC\"       unused   input  active-high \n<\/code><\/pre>\n<\/details>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"gpioget\">gpioget<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">place en entr\u00e9e et lit l&rsquo;\u00e9tat des lignes demand\u00e9es<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nbruno@rpi364:~\/Works\/gpiomonitor $ gpioget gpiochip0 17 27\n0 0<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"gpioset\">gpioset<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">place en sortie les lignes demand\u00e9es<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bruno@rpi364:~\/Works\/gpiomonitor $ gpioset gpiochip0 17=1 27=0<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"gpiofind\">gpiofind<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>bruno@rpi364:~\/Works\/gpiomonitor $ gpiofind \"GPIO17\"<br>gpiochip0 17<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"utilisation-du-langage-c\">Utilisation du langage C<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation-de-la-lib-et-de-la-doc\">installation de la lib et de la doc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"> normalement d\u00e9ja fait<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt install libgpiod-dev libgpiod-doc<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"structure-de-base-d-un-programme-c\"><strong>Structure de Base d&rsquo;un Programme<\/strong> c<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;gpiod.h>\n#include &lt;stdio.h>\n#include &lt;unistd.h>\n\nint main() {\n    const char *chipname = \"gpiochip0\";  \/\/ Nom du contr\u00f4leur GPIO\n    struct gpiod_chip *chip;\n    struct gpiod_line *line;\n    int ret;\n\n    \/\/ Ouvrir le chip GPIO\n    chip = gpiod_chip_open_by_name(chipname);\n    if (!chip) {\n        perror(\"Erreur d'ouverture du chip\");\n        return 1;\n    }\n\n    \/\/ Ici: Configuration des GPIO...\n\n    \/\/ Fermeture\n    gpiod_chip_close(chip);\n    return 0;\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"controle-des-gpio\"><strong>Contr\u00f4le des GPIO<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"configurer-une-sortie-led\"><strong>Configurer une sortie (LED)<\/strong><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Obtenir la ligne GPIO17\nline = gpiod_chip_get_line(chip, 17);\nif (!line) {\n    perror(\"Erreur ligne GPIO\");\n    gpiod_chip_close(chip);\n    return 1;\n}\n\n\/\/ Configurer en sortie avec \u00e9tat initial LOW\nret = gpiod_line_request_output(line, \"LED\", 0);\nif (ret &lt; 0) {\n    perror(\"Erreur config sortie\");\n    gpiod_line_release(line);\n    gpiod_chip_close(chip);\n    return 1;\n}\n\n\/\/ Allumer la LED\ngpiod_line_set_value(line, 1);\nsleep(1);\n\/\/ \u00c9teindre la LED\ngpiod_line_set_value(line, 0);\n\n\/\/ Lib\u00e9rer la ligne\ngpiod_line_release(line);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"lire-une-entree-bouton-ils\"><strong>Lire une entr\u00e9e (Bouton\/ILS)<\/strong><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">line = gpiod_chip_get_line(chip, 27);\nif (!line) {\n    perror(\"Erreur ligne GPIO\");\n    gpiod_chip_close(chip);\n    return 1;\n}\n\n\/\/ Configurer en entr\u00e9e avec pull-up\nstruct gpiod_line_request_config config = {\n    .consumer = \"Bouton\",\n    .request_type = GPIOD_LINE_REQUEST_DIRECTION_INPUT,\n    .flags = GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP\n};\n\nret = gpiod_line_request(line, &amp;config, 0);\nif (ret &lt; 0) {\n    perror(\"Erreur config entr\u00e9e\");\n    gpiod_line_release(line);\n    gpiod_chip_close(chip);\n    return 1;\n}\n\n\/\/ Lire l'\u00e9tat\nint val = gpiod_line_get_value(line);\nprintf(\"\u00c9tat: %d\\n\", val);  \/\/ 0=press\u00e9, 1=rel\u00e2ch\u00e9 (pull-up)\n\ngpiod_line_release(line);<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"exemple-en-c\">Exemple en C<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;gpiod.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;unistd.h&gt;\n\nint main() {\n    const char *chipname = \"gpiochip0\";\n    struct gpiod_chip *chip;\n    struct gpiod_line *line;\n    int ret;\n\n    \/\/ Ouvrir le chip GPIO\n    chip = gpiod_chip_open_by_name(chipname);\n    if (!chip) {\n        perror(\"Erreur d'ouverture du chip\");\n        return 1;\n    }\n\n    \/\/ Obtenir une ligne GPIO (ex: ligne 17)\n    line = gpiod_chip_get_line(chip, 17);\n    if (!line) {\n        perror(\"Erreur d'acc\u00e8s \u00e0 la ligne\");\n        gpiod_chip_close(chip);\n        return 1;\n    }\n\n    \/\/ Configurer la ligne en sortie\n    ret = gpiod_line_request_output(line, \"example\", 0);\n    if (ret &lt; 0) {\n        perror(\"Erreur de configuration\");\n        gpiod_chip_close(chip);\n        return 1;\n    }\n\n    \/\/ Faire clignoter la LED\n    for (int i = 0; i &lt; 5; i++) {\n        gpiod_line_set_value(line, 1);\n        sleep(1);\n        gpiod_line_set_value(line, 0);\n        sleep(1);\n    }\n\n    \/\/ Lib\u00e9rer les ressources\n    gpiod_chip_close(chip);\n    return 0;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"compiler-le-code-c\">Compiler le code c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>gcc ton_programme.c -o ton_programme -lgpiod<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentation: libgpiod&nbsp;est une biblioth\u00e8que et un ensemble d&rsquo;outils en mode utilisateur (userspace) pour interagir avec les GPIO (General Purpose Input\/Output) sur les syst\u00e8mes Linux, en particulier ceux utilisant l&rsquo;interface&nbsp;GPIO character device&nbsp;(introduite avec le noyau Linux 4.8). installation il faut appartenir au groupe gpio Pourquoi libgpiod ? Avant, les GPIO \u00e9taient souvent contr\u00f4l\u00e9s via l&rsquo;interface obsol\u00e8te&nbsp;\/sys\/class\/gpio&nbsp;(sysfs), [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-2951","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"admin","author_link":"https:\/\/workboot.fr\/ciela\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"Pr\u00e9sentation: libgpiod&nbsp;est une biblioth\u00e8que et un ensemble d&rsquo;outils en mode utilisateur (userspace) pour interagir avec les GPIO (General Purpose Input\/Output) sur les syst\u00e8mes Linux, en particulier ceux utilisant l&rsquo;interface&nbsp;GPIO character device&nbsp;(introduite avec le noyau Linux 4.8). installation il faut appartenir au groupe gpio Pourquoi libgpiod ? Avant, les GPIO \u00e9taient souvent contr\u00f4l\u00e9s via l&rsquo;interface obsol\u00e8te&nbsp;\/sys\/class\/gpio&nbsp;(sysfs),\u2026","_links":{"self":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages\/2951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/comments?post=2951"}],"version-history":[{"count":12,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages\/2951\/revisions"}],"predecessor-version":[{"id":3234,"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/pages\/2951\/revisions\/3234"}],"wp:attachment":[{"href":"https:\/\/workboot.fr\/ciela\/wp-json\/wp\/v2\/media?parent=2951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}