{"id":2483,"date":"2021-02-19T06:52:30","date_gmt":"2021-02-19T05:52:30","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=2483"},"modified":"2024-10-18T10:23:14","modified_gmt":"2024-10-18T08:23:14","slug":"tinyusb-a-simple-tutorial","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/","title":{"rendered":"TinyUSB a simple Tutorial"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Most Microcontrollers have a built in Serial USB functionality that can not be changed (e.g. <em>ESP32, ESP8266, Arduino Nano<\/em> etc). Some Microcontrollers however allow to (re-)progam the USB functionality (e.g. <em>Raspberry Pico, ESP32-S2, seeeduino xiao<\/em> etc) and<br \/>\n<a href=\"https:\/\/github.com\/hathach\/tinyusb\">TinyUSB<\/a> is the project of choice for this.<\/p>\n<p>A Microcontroller can either act as USB host or as device. In this blog I will concentrate on the <strong>USB device<\/strong> functionality, because this is where the library shines.<\/p>\n<p>A TinyUSB device can acts as<\/p>\n<ul>\n<li><strong>CDC<\/strong> Device (e.g. for Serial communication)<\/li>\n<li><strong>Audio<\/strong> Device (microphone, music player)<\/li>\n<li><strong>HID<\/strong> device (e.g. mouse or keyboard)<\/li>\n<li><strong>MIDI<\/strong> device (to generate or play MIDI music)<\/li>\n<li><strong>WebUSB<\/strong> device<\/li>\n<li><strong>Network<\/strong> device (providing TCP\/IP functionality over USB)<\/li>\n<\/ul>\n<p>In the <a href=\"https:\/\/github.com\/hathach\/tinyusb\/tree\/master\/examples\/device\">examples folder<\/a> you can find the code that demonstrates how to use the functionality.<\/p>\n<h2>A short introduction into USB<\/h2>\n<p>USB is quite a daunting beast and tremendously complex. In order to understand the library you need to understand the concept of descriptors. <a href=\"https:\/\/www.beyondlogic.org\/usbnutshell\/usb5.shtml\">BeyondLogic has an excellent introduction<\/a> that I can recommend. In a nutshell you usually have:<\/p>\n<ul>\n<li>One <strong>Device Descriptor<\/strong><\/li>\n<li>Usually one <strong>Configuration Descriptor<\/strong> <\/li>\n<li>One or many <strong>Interface Descriptors<\/strong> for each configuration<\/li>\n<li>One or many <strong>Endpoint Descriptors<\/strong> for each interface<\/li>\n<\/ul>\n<p>On top of these standard descriptors each devices might describe their additional <strong>device specific descriptors<\/strong>. And finally there is the possibility to <strong>define strings<\/strong> and use them with their <strong>index position<\/strong>.<\/p>\n<h2>Anatomy of a TinyUSB Example<\/h2>\n<p>The examples are usually structured into 3 files:<\/p>\n<ul>\n<li><strong>tusb_config.h<\/strong> &#8211; which contains the configuration<\/li>\n<li><strong>usb_descriptors.c<\/strong> &#8211; which contains the descriptors and their related callbacks<\/li>\n<li><strong>main.c<\/strong> &#8211; which contains the main logic and the implementation of callbacks<\/li>\n<\/ul>\n<p>However, you have quite some flexibility how to structure this in your own projects:<\/p>\n<ul>\n<li>You could use C++ so you have .cpp instead of .c implementation files<\/li>\n<li>You could combine the content of usb_descriptors.c and the main.c into one single implementation file (e.g. myproject.c).<\/li>\n<li>If you want to avoid the tusb_config.h, you can can use the <strong>CFG_TUSB_CONFIG_FILE<\/strong> define to point to your own header file name. You can do this e.g. in your CMakeList.txt with <\/li>\n<\/ul>\n<pre><code>add_compile_options(-CFG_TUSB_CONFIG_FILE=myproject.h ...\n<\/code><\/pre>\n<h2>The TinyUSB Configuration &#8211; tusb_config.h<\/h2>\n<p>The examples have quite some complexity because they need to support all types of environments. We can try to boil it down to the <strong>bare minimum<\/strong> which should work in most of the cases:<\/p>\n<pre><code>#pragma once\n\n\/\/--------------------------------------------------------------------\n\/\/ DEVICE CONFIGURATION\n\/\/--------------------------------------------------------------------\n\/\/#define BOARD_DEVICE_RHPORT_NUM     0\n#define BOARD_DEVICE_RHPORT_SPEED   OPT_MODE_HIGH_SPEED\n#define CFG_TUSB_RHPORT0_MODE      (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)\n#define CFG_TUD_ENDPOINT0_SIZE    64\n\n\/\/------------- CLASS -------------\/\/\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              1\n#define CFG_TUD_VENDOR            0\n\n\/\/ MIDI FIFO size of TX and RX\n#define CFG_TUD_MIDI_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_MIDI_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n\n\n<\/code><\/pre>\n<p>We define the maximum size of the endpoint and <strong>activate the classes<\/strong> that we want to use in our project. The number indicates the number of Interfaces that we want to define. In the example above we define that we use two CDC and one MIDI device.<\/p>\n<h2>The Descriptors &#8211; usb_descriptors.c<\/h2>\n<p>The descriptors need to be provided by implementing the following 3 callback methods:<\/p>\n<pre><code>uint8_t const * tud_descriptor_device_cb(void)\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)\n<\/code><\/pre>\n<p>The <strong>tud_descriptor_device_cb<\/strong> provides the device profile and the <strong>tud_descriptor_configuration_cb<\/strong> provides the concatenated Configuration, Interface and Endpoint profiles.<br \/>\nThe <strong>tud_descriptor_string_cb<\/strong> is responsible to provide the Strings in UTF8.<\/p>\n<p>All the complexity in the usb_descriptors.c is related to the definition of the descriptors!<\/p>\n<h2>The Program Logic &#8211; main.c<\/h2>\n<p>The basic anatomy of the TinyUSB logic is quite simple:<\/p>\n<ul>\n<li>You need to setup the board by calling <strong>board_init()<\/strong><\/li>\n<li>You need to setup the usb functionality by calling <strong>tusb_init()<\/strong><\/li>\n<li>You need to call <strong>tud_task()<\/strong> &#8211; as often as possible to make the &#8216;midi engine&#8217; do it&#8217;s work.<\/li>\n<\/ul>\n<p>The remaining parts are application specific: you might want to do some actual midi generation or send some messages via cdc and blink your leds.<\/p>\n<pre><code><br \/>int main(void)\n{\n  board_init();\n  tusb_init();\n\n  while (1)\n  {\n    tud_task(); \/\/ tinyusb device task\n    midi_task();\n    led_blinking_task();\n  }\n\n  return 0;\n}\n<\/code><\/pre>\n<p>In order to be able to react to some events, the following callbacks are provided by the framework:<\/p>\n<pre><code>void tud_mount_cb(void) \/\/ Invoked when device is mounted\nvoid tud_umount_cb(void) \/\/ Invoked when device is unmounted\nvoid tud_suspend_cb(bool remote_wakeup_en) \/\/ Invoked when usb bus is suspended\nvoid tud_resume_cb(void) \/\/ Invoked when usb bus is resumed\n<\/code><\/pre>\n<p>In the examples, these callback methods are used to change the LED blinking speed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Most Microcontrollers have a built in Serial USB functionality that can not be changed (e.g. ESP32, ESP8266, Arduino Nano etc). Some Microcontrollers however allow to (re-)progam the USB functionality (e.g. Raspberry Pico, ESP32-S2, seeeduino xiao etc) and TinyUSB is the project of choice for this. A Microcontroller can either [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2487,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[20,24],"tags":[48],"class_list":["post-2483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-pico","tag-tinyusb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TinyUSB a simple Tutorial - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TinyUSB a simple Tutorial - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"Introduction Most Microcontrollers have a built in Serial USB functionality that can not be changed (e.g. ESP32, ESP8266, Arduino Nano etc). Some Microcontrollers however allow to (re-)progam the USB functionality (e.g. Raspberry Pico, ESP32-S2, seeeduino xiao etc) and TinyUSB is the project of choice for this. A Microcontroller can either [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-19T05:52:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-18T08:23:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2021\/02\/USB.png\" \/>\n\t<meta property=\"og:image:width\" content=\"324\" \/>\n\t<meta property=\"og:image:height\" content=\"155\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"TinyUSB a simple Tutorial\",\"datePublished\":\"2021-02-19T05:52:30+00:00\",\"dateModified\":\"2024-10-18T08:23:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/\"},\"wordCount\":643,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/USB.png\",\"keywords\":[\"TinyUSB\"],\"articleSection\":[\"Arduino\",\"Pico\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/\",\"name\":\"TinyUSB a simple Tutorial - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/USB.png\",\"datePublished\":\"2021-02-19T05:52:30+00:00\",\"dateModified\":\"2024-10-18T08:23:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/USB.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/USB.png\",\"width\":324,\"height\":155},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2021\\\/02\\\/19\\\/tinyusb-a-simple-tutorial\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TinyUSB a simple Tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TinyUSB a simple Tutorial - Phil Schatzmann","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:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/","og_locale":"en_US","og_type":"article","og_title":"TinyUSB a simple Tutorial - Phil Schatzmann","og_description":"Introduction Most Microcontrollers have a built in Serial USB functionality that can not be changed (e.g. ESP32, ESP8266, Arduino Nano etc). Some Microcontrollers however allow to (re-)progam the USB functionality (e.g. Raspberry Pico, ESP32-S2, seeeduino xiao etc) and TinyUSB is the project of choice for this. A Microcontroller can either [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/","og_site_name":"Phil Schatzmann","article_published_time":"2021-02-19T05:52:30+00:00","article_modified_time":"2024-10-18T08:23:14+00:00","og_image":[{"width":324,"height":155,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2021\/02\/USB.png","type":"image\/png"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"TinyUSB a simple Tutorial","datePublished":"2021-02-19T05:52:30+00:00","dateModified":"2024-10-18T08:23:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/"},"wordCount":643,"commentCount":1,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2021\/02\/USB.png","keywords":["TinyUSB"],"articleSection":["Arduino","Pico"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/","url":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/","name":"TinyUSB a simple Tutorial - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2021\/02\/USB.png","datePublished":"2021-02-19T05:52:30+00:00","dateModified":"2024-10-18T08:23:14+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2021\/02\/USB.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2021\/02\/USB.png","width":324,"height":155},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2021\/02\/19\/tinyusb-a-simple-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"TinyUSB a simple Tutorial"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/2483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=2483"}],"version-history":[{"count":35,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/2483\/revisions"}],"predecessor-version":[{"id":2519,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/2483\/revisions\/2519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/2487"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=2483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=2483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=2483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}