mirror of https://github.com/pikvm/pikvm.git
6301 lines
245 KiB
HTML
6301 lines
245 KiB
HTML
<!DOCTYPE html><html lang="en" class="no-js"><head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
<meta name="description" content="Documentation for all functions of PiKVM microservices exposed via RESTful APIs">
|
|
|
|
|
|
<meta name="author" content="Maxim Devaev">
|
|
|
|
|
|
<link rel="canonical" href="https://pikvm.github.io/pikvm/api/">
|
|
|
|
|
|
<link rel="prev" href="../prometheus/">
|
|
|
|
|
|
<link rel="next" href="../building_os/">
|
|
|
|
|
|
<link rel="icon" href="../_assets/favicon.ico">
|
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.22">
|
|
|
|
|
|
|
|
<title>HTTP API reference - PiKVM Handbook</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/main.84d31ad4.min.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=arial,+sans-serif:300,300i,400,400i,700,700i%7Cmonospace:400,400i,700,700i&display=fallback">
|
|
<style>:root{--md-text-font:"arial, sans-serif";--md-code-font:"monospace"}</style>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../_assets/user.css">
|
|
|
|
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link href="../assets/stylesheets/glightbox.min.css" rel="stylesheet"><script src="../assets/javascripts/glightbox.min.js"></script><style id="glightbox-style">
|
|
html.glightbox-open { overflow: initial; height: 100%; }
|
|
.gslide-title { margin-top: 0px; user-select: text; }
|
|
.gslide-desc { color: #666; user-select: text; }
|
|
.gslide-image img { background: white; }
|
|
.gscrollbar-fixer { padding-right: 15px; }
|
|
.gdesc-inner { font-size: 0.75rem; }
|
|
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color); }
|
|
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color); }
|
|
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color); }
|
|
</style></head>
|
|
|
|
|
|
<body dir="ltr">
|
|
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#authentication" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<header class="md-header md-header--shadow" data-md-component="header">
|
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
|
<a href=".." title="PiKVM Handbook" class="md-header__button md-logo" aria-label="PiKVM Handbook" data-md-component="logo">
|
|
|
|
<img src="../_assets/logo.png" alt="logo">
|
|
|
|
</a>
|
|
<label class="md-header__button md-icon" for="__drawer">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"></path></svg>
|
|
</label>
|
|
<div class="md-header__title" data-md-component="header-title">
|
|
<div class="md-header__ellipsis">
|
|
<div class="md-header__topic">
|
|
<span class="md-ellipsis">
|
|
PiKVM Handbook
|
|
</span>
|
|
</div>
|
|
<div class="md-header__topic" data-md-component="header-topic">
|
|
<span class="md-ellipsis">
|
|
|
|
HTTP API reference
|
|
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-header__button md-icon" for="__search">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
|
|
</label>
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"></path></svg>
|
|
</label>
|
|
<nav class="md-search__options" aria-label="Search">
|
|
|
|
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"></path></svg>
|
|
</a>
|
|
|
|
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></svg>
|
|
</button>
|
|
</nav>
|
|
|
|
<div class="md-search__suggest" data-md-component="search-suggest"></div>
|
|
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list" role="presentation"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-header__source">
|
|
<a href="https://github.com/pikvm/pikvm" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
pikvm/pikvm
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href=".." title="PiKVM Handbook" class="md-nav__button md-logo" aria-label="PiKVM Handbook" data-md-component="logo">
|
|
|
|
<img src="../_assets/logo.png" alt="logo">
|
|
|
|
</a>
|
|
PiKVM Handbook
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
<a href="https://github.com/pikvm/pikvm" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
pikvm/pikvm
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_1">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Device guides
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_1">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Device guides
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../v4/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
PiKVM V4 Mini & Plus
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../v3/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
PiKVM V3
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../switch/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
PiKVM Switch
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../v2/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
DIY PiKVM V2
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../v1/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
DIY PiKVM V1
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Getting started
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_2">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Getting started
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cheatsheet/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Cheat Sheet
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../webui/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Web UI Overview
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../config/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Configuring PiKVM
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../auth/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Authentication & 2FA
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../faq/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
FAQ & Troubleshooting
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../flashing_os/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Flashing OS
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Networking
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_3">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Networking
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_1">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Internet access
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_3_1">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Internet access
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../port_forwarding/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Port forwarding
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../reverse_proxy/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Reverse proxy
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../tailscale/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Tailscale VPN
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cloudflared/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Cloudflare Tunnel
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../wifi/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Setting up Wi-Fi
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../modem/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Setting up 3G/4G/LTE modem
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../letsencrypt/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Let's Encrypt certificates
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Video
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_4">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Video
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../video/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Video modes (WebRTC, Direct)
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../webrtc_config/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
WebRTC configuration
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../edid/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Tuning HDMI EDID
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pass/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
HDMI passthrough
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Peripheral devices
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_5">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Peripheral devices
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../atx_board/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
ATX board
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../usb/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
USB configuration
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../usb_pass/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
USB passthrough
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../audio/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Audio / Microphone
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_5">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_5_5" id="__nav_5_5_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Keyboard & mouse
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_5_5">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Keyboard & mouse
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mouse/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Mouse modes
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mouse_jiggler/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Mouse jiggler
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pico_hid/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Pico HID (USB, PS/2)
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../bluetooth_hid/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Bluetooth HID
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../msd/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Mass Storage Drive
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../usb_ethernet/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Ethernet-over-USB
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../usb_serial/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Serial-over-USB
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../gpio/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
GPIO (pins, relays, lamps, etc)
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Advanced usage
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_6">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Advanced usage
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../auth_advanced/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Advanced authentication
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../id/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
PiKVM identification
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../on_boot_config/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
On-boot configuration
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../auto_snapshots/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Automatic snapshots
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../vnc/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Using VNC
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../multiport/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Multiport KVM-over-IP
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../wol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Wake-on-LAN the server
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ipmi/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
IPMI & Redfish integration
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pst/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Persistent storage
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../prometheus/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Prometheus monitoring
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Development
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
|
|
<label class="md-nav__title" for="__nav_7">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Development
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
HTTP API reference
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
HTTP API reference
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#authentication" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Authentication
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Authentication">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#single-request-authentication" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Single-request authentication
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#session-based-cookie-auth" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Session-based cookie auth
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#session-based-login-using-html-form" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Session-based login using HTML form
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#websocket-events" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
WebSocket events
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#system-functions" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
System functions
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="System functions">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-system-info" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get system info
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-system-log" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get system log
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#hid" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
HID
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="HID">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-devices-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get devices state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-parameters" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set parameters
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-the-connected-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set the connected state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#reset-devices-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Reset devices' state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-keyboard-layouts" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get keyboard layouts
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#type-text-remotely" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Type text remotely
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-a-keyboard-shortcut" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send a keyboard shortcut
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-a-single-key-event" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send a single key event
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-mouse-button-events" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send mouse button events
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#move-the-mouse-pointer" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Move the mouse pointer
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#move-the-mouse-ppinter-relatively" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Move the mouse ppinter relatively
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-mouse-wheel-scroll-events" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send mouse wheel scroll events
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#atx-power-management" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
ATX power management
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="ATX power management">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-atx-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get ATX state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-atx-power" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set ATX power
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#click-atx-button" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Click ATX button
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#mass-storage-drive" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Mass Storage Drive
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Mass Storage Drive">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-msd-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get MSD state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#upload-msd-image" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Upload MSD image
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#upload-msd-image-by-url" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Upload MSD image by URL
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-msd-parameters" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set MSD parameters
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#control-msd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Control MSD
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#remove-msd-image" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Remove MSD image
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#reset-msd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Reset MSD
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#gpio" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
GPIO
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="GPIO">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-gpio-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get GPIO state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#switch-gpio-channel" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Switch GPIO channel
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#pulse-gpio-channel" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Pulse GPIO channel
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#streamer" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Streamer
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Streamer">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-streamer-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get streamer state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#take-snapshot" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Take snapshot
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#remove-snapshot" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Remove snapshot
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-ocr-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get OCR state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#switch" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Switch
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Switch">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-switch-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get Switch state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-active-port-previous" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set active port (previous)
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-active-port-next" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set active port (next)
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-active-port-specific" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set active port (specific)
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-beacon" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set beacon
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-port-parameters" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set port parameters
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-beacon-color" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set beacon color
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#reboot-the-device" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Reboot the device
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#create-a-new-edid-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Create a new EDID configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#change-edid-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Change EDID configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#remove-edid-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Remove EDID configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#atx-power-control" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
ATX Power Control
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#atx-button-click" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
ATX Button Click
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#redfish" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Redfish
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Redfish">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#root-service-discovery" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Root service discovery
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#systems-collection" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Systems collection
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#individual-system-information" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Individual system information
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#system-configuration-update" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
System configuration update
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#system-power-control" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
System power control
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#misc" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Misc
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Misc">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-prometheus-metrics" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get Prometheus metrics
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#video" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Video
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Video">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-raw-h264-video-stream" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get raw H.264 video stream
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../building_os/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Building PiKVM OS
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../3d_printing/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Cases for 3D printing
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Legacy
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_8">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Legacy
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../arduino_hid/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Arduino HID
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../msd_legacy/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Big DVD images on old PiKVM
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
PiKVM Info
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_9">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
PiKVM Info
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../compliance/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Compliance
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9_2">
|
|
|
|
|
|
<div class="md-nav__link md-nav__container">
|
|
<a href="../blog/" class="md-nav__link ">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Blog & News
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
|
|
|
|
<label class="md-nav__link " for="__nav_9_2" id="__nav_9_2_label" tabindex="0">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_9_2_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_9_2">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Blog & News
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9_2_2">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_9_2_2" id="__nav_9_2_2_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Archive
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_9_2_2_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_9_2_2">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Archive
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/archive/2025/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
2025
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/archive/2024/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
2024
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/archive/2023/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
2023
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/archive/2022/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
2022
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/archive/2021/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
2021
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/archive/2020/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
2020
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9_2_3">
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_9_2_3" id="__nav_9_2_3_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Categories
|
|
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_9_2_3_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_9_2_3">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Categories
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/category/development/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Development
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/category/products/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Products
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../blog/category/releases/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Releases
|
|
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#authentication" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Authentication
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Authentication">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#single-request-authentication" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Single-request authentication
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#session-based-cookie-auth" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Session-based cookie auth
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#session-based-login-using-html-form" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Session-based login using HTML form
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#websocket-events" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
WebSocket events
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#system-functions" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
System functions
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="System functions">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-system-info" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get system info
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-system-log" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get system log
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#hid" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
HID
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="HID">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-devices-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get devices state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-parameters" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set parameters
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-the-connected-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set the connected state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#reset-devices-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Reset devices' state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-keyboard-layouts" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get keyboard layouts
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#type-text-remotely" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Type text remotely
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-a-keyboard-shortcut" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send a keyboard shortcut
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-a-single-key-event" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send a single key event
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-mouse-button-events" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send mouse button events
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#move-the-mouse-pointer" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Move the mouse pointer
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#move-the-mouse-ppinter-relatively" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Move the mouse ppinter relatively
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#send-mouse-wheel-scroll-events" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Send mouse wheel scroll events
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#atx-power-management" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
ATX power management
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="ATX power management">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-atx-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get ATX state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-atx-power" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set ATX power
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#click-atx-button" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Click ATX button
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#mass-storage-drive" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Mass Storage Drive
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Mass Storage Drive">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-msd-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get MSD state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#upload-msd-image" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Upload MSD image
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#upload-msd-image-by-url" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Upload MSD image by URL
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-msd-parameters" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set MSD parameters
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#control-msd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Control MSD
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#remove-msd-image" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Remove MSD image
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#reset-msd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Reset MSD
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#gpio" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
GPIO
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="GPIO">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-gpio-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get GPIO state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#switch-gpio-channel" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Switch GPIO channel
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#pulse-gpio-channel" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Pulse GPIO channel
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#streamer" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Streamer
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Streamer">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-streamer-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get streamer state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#take-snapshot" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Take snapshot
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#remove-snapshot" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Remove snapshot
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-ocr-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get OCR state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#switch" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Switch
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Switch">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-switch-state" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get Switch state
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-active-port-previous" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set active port (previous)
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-active-port-next" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set active port (next)
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-active-port-specific" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set active port (specific)
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-beacon" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set beacon
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-port-parameters" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set port parameters
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#set-beacon-color" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Set beacon color
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#reboot-the-device" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Reboot the device
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#create-a-new-edid-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Create a new EDID configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#change-edid-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Change EDID configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#remove-edid-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Remove EDID configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#atx-power-control" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
ATX Power Control
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#atx-button-click" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
ATX Button Click
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#redfish" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Redfish
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Redfish">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#root-service-discovery" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Root service discovery
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#systems-collection" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Systems collection
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#individual-system-information" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Individual system information
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#system-configuration-update" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
System configuration update
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#system-power-control" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
System power control
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#misc" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Misc
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Misc">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-prometheus-metrics" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get Prometheus metrics
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#video" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Video
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Video">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#get-raw-h264-video-stream" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Get raw H.264 video stream
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
|
|
<h1>HTTP API reference</h1>
|
|
|
|
<div><p>This document describes the PiKVM API. Since the system consists of microservices, here is a common API with a common entry point provided by Nginx. The below examples use <code>curl</code> and <a href="https://github.com/vi/websocat"><code>websocat</code></a> with the <code>-k</code> option disables SSL certificate verification, since the self-signed certificateis are used in the default installation.</p>
|
|
<p>There is a <a href="https://github.com/guanana/pikvm-lib">third-party library</a> for using the PiKVM API. Please note that this is an unofficial library, so use it carefully.</p>
|
|
<hr>
|
|
<h2 id="authentication">Authentication<a class="headerlink" href="#authentication" title="Permanent link">¶</a></h2>
|
|
<p>All APIs are restricted to authentication. To make requests, you either need to auth each request individually, or get a token and pass it as a cookie with each request.</p>
|
|
<p>With enabled <a href="../auth/#two-factor-authentication">2FA</a>, you will need to add the one-time code to the password without spaces. That is, if the password is <code>foobar</code> and the code is <code>123456</code>, then you need to use <code>foobar123456</code> as the password.</p>
|
|
<p>The code can be generated using any TOTP library, for example in Python:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">requests</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">pyotp</span>
|
|
|
|
<span class="n">user</span> <span class="o">=</span> <span class="s2">"admin"</span>
|
|
<span class="n">passwd</span> <span class="o">=</span> <span class="s2">"admin"</span>
|
|
<span class="n">secret</span> <span class="o">=</span> <span class="s2">"3OBBOGSJRYRBZH35PGXURM4CMWTH3WSU"</span> <span class="c1"># Can be found in /etc/kvmd/totp.secret</span>
|
|
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
|
|
<span class="n">url</span><span class="o">=</span><span class="s2">"https://pikvm/api/info"</span><span class="p">,</span>
|
|
<span class="n">verify</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="c1"># For self-signed SSL certificate</span>
|
|
<span class="n">headers</span><span class="o">=</span><span class="p">{</span>
|
|
<span class="s2">"X-KVMD-User"</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span>
|
|
<span class="s2">"X-KVMD-Passwd"</span><span class="p">:</span> <span class="n">passwd</span> <span class="o">+</span> <span class="n">pyotp</span><span class="o">.</span><span class="n">TOTP</span><span class="p">(</span><span class="n">secret</span><span class="p">)</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span>
|
|
<span class="p">},</span>
|
|
<span class="p">)</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
<p>Since in the borderline case of the 2FA code lifetime, the code may be invalid,
|
|
it makes sense to either handle error 403 by repeating the request in seconds.</p>
|
|
<p>A more correct way is to combine this method and check the remaining lifetime
|
|
and postpone the request if there is a second or so left. You can find out how much
|
|
time is left in this way:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="n">totp</span> <span class="o">=</span> <span class="n">pyotp</span><span class="o">.</span><span class="n">TOTP</span><span class="p">(</span><span class="n">secret</span><span class="p">)</span>
|
|
<span class="n">now</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
|
|
<span class="n">remaining</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="p">(</span><span class="n">now</span> <span class="o">%</span> <span class="n">totp</span><span class="o">.</span><span class="n">interval</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
<h3 id="single-request-authentication">Single-request authentication<a class="headerlink" href="#single-request-authentication" title="Permanent link">¶</a></h3>
|
|
<p>There are two options here:</p>
|
|
<ul>
|
|
<li>
|
|
<p><strong>Using X-headers.</strong> Just pass <code>X-KVMD-User</code> and <code>X-KVMD-Passwd</code> with the request:</p>
|
|
<div class="highlight"><pre><span></span><code>$ curl -k -H X-KVMD-User:admin -H X-KVMD-Passwd:admin https://<pikvm-ip>/api/auth/check
|
|
</code></pre></div>
|
|
</li>
|
|
<li>
|
|
<p><strong>Using HTTP Basic Auth.</strong> Please note: contrary to the standard, this method DOES NOT use the <code>WWW-Authenticate</code> header. HTTP Basic Auth in this implementation is intended only for compatibility with other systems, such as <a href="../prometheus/">Prometheus</a>.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/auth/check
|
|
</code></pre></div>
|
|
</li>
|
|
</ul>
|
|
<h3 id="session-based-cookie-auth">Session-based cookie auth<a class="headerlink" href="#session-based-cookie-auth" title="Permanent link">¶</a></h3>
|
|
<ol>
|
|
<li>
|
|
<p>Get the access token for the user using <code>POST /api/auth/login</code>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-v<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>--data<span class="w"> </span><span class="nv">user</span><span class="o">=</span>admin<span class="w"> </span>--data<span class="w"> </span><span class="nv">passwd</span><span class="o">=</span>admin<span class="w"> </span>https://pikvm/api/auth/login
|
|
<span class="go">...</span>
|
|
<span class="go">< Set-Cookie: auth_token=796cb83b11de4fcb749bc1bad14a91fb06dede84672b2f847fef1e988e6900de; Path=/</span>
|
|
<span class="go">...</span>
|
|
</code></pre></div>
|
|
<p>On success the cookie <code>auth_token</code> will be received with <code>200 OK</code>. On invalid user or password you will get <code>403 Forbidden</code>.</p>
|
|
</li>
|
|
<li>
|
|
<p>The handle <code>GET /api/auth/check</code> can be used for check the auth status. Return of <code>200 OK</code> will signal that user is authenticated. If the token or any of the single-request auth methods are missing, <code>401 Unauthorized</code> will be returned. In case of incorrect credentials or token, <code>403 Forbidden</code> will be returned.</p>
|
|
</li>
|
|
<li>
|
|
<p>The handle <code>POST /api/auth/logout</code> can be used to invalidate session token. The response codes will be similar to the previous handle.</p>
|
|
</li>
|
|
</ol>
|
|
<h3 id="session-based-login-using-html-form">Session-based login using HTML form<a class="headerlink" href="#session-based-login-using-html-form" title="Permanent link">¶</a></h3>
|
|
<p>You can submit PiKVM credentials from another site and go directly to the KVM page by passing the redirect parameter as follows:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p"><</span><span class="nt">html</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">form</span> <span class="na">method</span><span class="o">=</span><span class="s">"POST"</span> <span class="na">action</span><span class="o">=</span><span class="s">"https://pikvm/api/auth/login"</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">input</span> <span class="na">name</span><span class="o">=</span><span class="s">"user"</span> <span class="na">value</span><span class="o">=</span><span class="s">"admin"</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">input</span> <span class="na">name</span><span class="o">=</span><span class="s">"passwd"</span> <span class="na">value</span><span class="o">=</span><span class="s">"admin"</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">input</span> <span class="na">name</span><span class="o">=</span><span class="s">"expire"</span> <span class="na">value</span><span class="o">=</span><span class="s">"0"</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">input</span> <span class="na">name</span><span class="o">=</span><span class="s">"redirect"</span> <span class="na">value</span><span class="o">=</span><span class="s">"/kvm/"</span><span class="p">></span> <span class="cm"><!-- Available since KVMD 4.108 --></span>
|
|
<span class="p"><</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span><span class="p">></span>Open PiKVM<span class="p"></</span><span class="nt">button</span><span class="p">></span>
|
|
<span class="p"></</span><span class="nt">form</span><span class="p">></span>
|
|
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
|
|
<span class="p"><</span><span class="nt">html</span><span class="p">></span>
|
|
</code></pre></div>
|
|
<hr>
|
|
<h2 id="websocket-events">WebSocket events<a class="headerlink" href="#websocket-events" title="Permanent link">¶</a></h2>
|
|
<p>Most of the data during the user's work with PiKVM is transmitted over WebSocket. This includes mouse events, keyboard input, and changing the state of the various subsystems (such as ATX and Mass Storage Drive). Each event type will be described in the corresponding paragraph for its component. When connecting via WebSocket, the client receives current states as separate events. Then, as the states change, it will receive new events.</p>
|
|
<p>In a normal situation, opening a socket session triggers the video streamer to start. The streamer works as long as there is at least one client connected via WebSocket. After the last connection is closed and the client timeout expires, the streamer will also be terminated.</p>
|
|
<p>It is possible create a session that will not start the streamer and will not be counted when counting clients to stop the streamer. To do this, use the URL parameter <code>stream=0</code>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>websocat<span class="w"> </span>-k<span class="w"> </span>wss://<pikvm-ip>/api/ws?stream<span class="o">=</span><span class="m">0</span><span class="w"> </span>-H<span class="w"> </span>X-KVMD-User:admin<span class="w"> </span>-H<span class="w"> </span>X-KVMD-Passwd:admin
|
|
</code></pre></div>
|
|
<details class="example">
|
|
<summary>Output with initial events</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"gpio_model_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"scheme"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"inputs"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"led1"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"hw"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"driver"</span><span class="o">:</span><span class="w"> </span><span class="s2">"__gpio__"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pin"</span><span class="o">:</span><span class="w"> </span><span class="mf">19</span><span class="p">}},</span><span class="w"> </span><span class="s2">"led2"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"hw"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"driver"</span><span class="o">:</span><span class="w"> </span><span class="s2">"__gpio__"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pin"</span><span class="o">:</span><span class="w"> </span><span class="mf">16</span><span class="p">}}},</span><span class="w"> </span><span class="s2">"outputs"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"button1"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"switch"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"pulse"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"min_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"max_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">},</span><span class="w"> </span><span class="s2">"hw"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"driver"</span><span class="o">:</span><span class="w"> </span><span class="s2">"__gpio__"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pin"</span><span class="o">:</span><span class="w"> </span><span class="mf">26</span><span class="p">}},</span><span class="w"> </span><span class="s2">"button2"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"switch"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"pulse"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"min_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"max_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">},</span><span class="w"> </span><span class="s2">"hw"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"driver"</span><span class="o">:</span><span class="w"> </span><span class="s2">"__gpio__"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pin"</span><span class="o">:</span><span class="w"> </span><span class="mf">20</span><span class="p">}},</span><span class="w"> </span><span class="s2">"relay1"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"switch"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"pulse"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"min_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"max_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">},</span><span class="w"> </span><span class="s2">"hw"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"driver"</span><span class="o">:</span><span class="w"> </span><span class="s2">"relay"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pin"</span><span class="o">:</span><span class="w"> </span><span class="mf">0</span><span class="p">}},</span><span class="w"> </span><span class="s2">"relay2"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"switch"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"pulse"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="s2">"min_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">0.1</span><span class="p">,</span><span class="w"> </span><span class="s2">"max_delay"</span><span class="o">:</span><span class="w"> </span><span class="mf">5.0</span><span class="p">},</span><span class="w"> </span><span class="s2">"hw"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"driver"</span><span class="o">:</span><span class="w"> </span><span class="s2">"relay"</span><span class="p">,</span><span class="w"> </span><span class="s2">"pin"</span><span class="o">:</span><span class="w"> </span><span class="mf">1</span><span class="p">}}}},</span><span class="w"> </span><span class="s2">"view"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"header"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"title"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Switches"</span><span class="p">},</span><span class="w"> </span><span class="s2">"table"</span><span class="o">:</span><span class="w"> </span><span class="p">[[{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Generic GPIO leds"</span><span class="p">}],</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="p">[{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Test 1:"</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"input"</span><span class="p">,</span><span class="w"> </span><span class="s2">"channel"</span><span class="o">:</span><span class="w"> </span><span class="s2">"led1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"color"</span><span class="o">:</span><span class="w"> </span><span class="s2">"green"</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"output"</span><span class="p">,</span><span class="w"> </span><span class="s2">"channel"</span><span class="o">:</span><span class="w"> </span><span class="s2">"button1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Click"</span><span class="p">}],</span><span class="w"> </span><span class="p">[{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Test 2:"</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"input"</span><span class="p">,</span><span class="w"> </span><span class="s2">"channel"</span><span class="o">:</span><span class="w"> </span><span class="s2">"led2"</span><span class="p">,</span><span class="w"> </span><span class="s2">"color"</span><span class="o">:</span><span class="w"> </span><span class="s2">"green"</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"output"</span><span class="p">,</span><span class="w"> </span><span class="s2">"channel"</span><span class="o">:</span><span class="w"> </span><span class="s2">"button2"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Click"</span><span class="p">}],</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="p">[{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"HID Relays /dev/hidraw0"</span><span class="p">}],</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="p">[{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Relay #1:"</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"output"</span><span class="p">,</span><span class="w"> </span><span class="s2">"channel"</span><span class="o">:</span><span class="w"> </span><span class="s2">"relay1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Boop 0.1"</span><span class="p">}],</span><span class="w"> </span><span class="p">[{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Relay #2:"</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"output"</span><span class="p">,</span><span class="w"> </span><span class="s2">"channel"</span><span class="o">:</span><span class="w"> </span><span class="s2">"relay2"</span><span class="p">,</span><span class="w"> </span><span class="s2">"text"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Boop 2.0"</span><span class="p">}]]}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"info_extras_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"vnc"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"VNC"</span><span class="p">,</span><span class="w"> </span><span class="s2">"description"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Show VNC information"</span><span class="p">,</span><span class="w"> </span><span class="s2">"icon"</span><span class="o">:</span><span class="w"> </span><span class="s2">"share/svg/vnc.svg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"vnc"</span><span class="p">,</span><span class="w"> </span><span class="s2">"keyboard_cap"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"daemon"</span><span class="o">:</span><span class="w"> </span><span class="s2">"kvmd-vnc"</span><span class="p">,</span><span class="w"> </span><span class="s2">"port"</span><span class="o">:</span><span class="w"> </span><span class="mf">5900</span><span class="p">,</span><span class="w"> </span><span class="s2">"place"</span><span class="o">:</span><span class="w"> </span><span class="mf">20</span><span class="p">,</span><span class="w"> </span><span class="s2">"enabled"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">},</span><span class="w"> </span><span class="s2">"ipmi"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"IPMI"</span><span class="p">,</span><span class="w"> </span><span class="s2">"description"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Show IPMI information"</span><span class="p">,</span><span class="w"> </span><span class="s2">"icon"</span><span class="o">:</span><span class="w"> </span><span class="s2">"share/svg/ipmi.svg"</span><span class="p">,</span><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"ipmi"</span><span class="p">,</span><span class="w"> </span><span class="s2">"keyboard_cap"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"daemon"</span><span class="o">:</span><span class="w"> </span><span class="s2">"kvmd-ipmi"</span><span class="p">,</span><span class="w"> </span><span class="s2">"port"</span><span class="o">:</span><span class="w"> </span><span class="mf">623</span><span class="p">,</span><span class="w"> </span><span class="s2">"place"</span><span class="o">:</span><span class="w"> </span><span class="mf">21</span><span class="p">,</span><span class="w"> </span><span class="s2">"enabled"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"info_hw_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"platform"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"rpi"</span><span class="p">,</span><span class="w"> </span><span class="s2">"base"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Virtual Raspberry Pi"</span><span class="p">},</span><span class="w"> </span><span class="s2">"health"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"temp"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"cpu"</span><span class="o">:</span><span class="w"> </span><span class="mf">36.511</span><span class="p">,</span><span class="w"> </span><span class="s2">"gpu"</span><span class="o">:</span><span class="w"> </span><span class="mf">35.0</span><span class="p">},</span><span class="w"> </span><span class="s2">"throttling"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"raw_flags"</span><span class="o">:</span><span class="w"> </span><span class="mf">0</span><span class="p">,</span><span class="w"> </span><span class="s2">"parsed_flags"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"undervoltage"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"now"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"past"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"freq_capped"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"now"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"past"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"throttled"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"now"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"past"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">}}}}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"info_meta_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"server"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"host"</span><span class="o">:</span><span class="w"> </span><span class="s2">"localhost.localdomain"</span><span class="p">},</span><span class="w"> </span><span class="s2">"kvm"</span><span class="o">:</span><span class="w"> </span><span class="p">{}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"info_system_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"kvmd"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"version"</span><span class="o">:</span><span class="w"> </span><span class="s2">"1.102"</span><span class="p">},</span><span class="w"> </span><span class="s2">"streamer"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"app"</span><span class="o">:</span><span class="w"> </span><span class="s2">"ustreamer"</span><span class="p">,</span><span class="w"> </span><span class="s2">"version"</span><span class="o">:</span><span class="w"> </span><span class="s2">"1.25"</span><span class="p">,</span><span class="w"> </span><span class="s2">"features"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"WITH_OMX"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"WITH_GPIO"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"WITH_PTHREAD_NP"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"WITH_SETPROCTITLE"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"HAS_PDEATHSIG"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">}},</span><span class="w"> </span><span class="s2">"kernel"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"system"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Linux"</span><span class="p">,</span><span class="w"> </span><span class="s2">"release"</span><span class="o">:</span><span class="w"> </span><span class="s2">"5.8.10-arch1-1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"version"</span><span class="o">:</span><span class="w"> </span><span class="s2">"#1 SMP PREEMPT Thu, 17 Sep 2020 18:01:06 +0000"</span><span class="p">,</span><span class="w"> </span><span class="s2">"machine"</span><span class="o">:</span><span class="w"> </span><span class="s2">"x86_64"</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"wol_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"enabled"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"target"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"ip"</span><span class="o">:</span><span class="w"> </span><span class="s2">"255.255.255.255"</span><span class="p">,</span><span class="w"> </span><span class="s2">"port"</span><span class="o">:</span><span class="w"> </span><span class="mf">9</span><span class="p">,</span><span class="w"> </span><span class="s2">"mac"</span><span class="o">:</span><span class="w"> </span><span class="s2">""</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"gpio_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"inputs"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"led1"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"state"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"led2"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"state"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">}},</span><span class="w"> </span><span class="s2">"outputs"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"button1"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"state"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"busy"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"button2"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"state"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"busy"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"relay1"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"state"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"busy"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"relay2"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"state"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"busy"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">}}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"hid_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"keyboard"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"leds"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"caps"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"scroll"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"num"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">}},</span><span class="w"> </span><span class="s2">"mouse"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"atx_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"enabled"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"busy"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"leds"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"power"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"hdd"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"msd_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"enabled"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"online"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"busy"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"storage"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"size"</span><span class="o">:</span><span class="w"> </span><span class="mf">234950152192</span><span class="p">,</span><span class="w"> </span><span class="s2">"free"</span><span class="o">:</span><span class="w"> </span><span class="mf">23514271744</span><span class="p">,</span><span class="w"> </span><span class="s2">"images"</span><span class="o">:</span><span class="w"> </span><span class="p">{},</span><span class="w"> </span><span class="s2">"uploading"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">},</span><span class="w"> </span><span class="s2">"drive"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"image"</span><span class="o">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="s2">"connected"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="s2">"cdrom"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">},</span><span class="w"> </span><span class="s2">"features"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"multi"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"cdrom"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"streamer_state"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"limits"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"max_fps"</span><span class="o">:</span><span class="w"> </span><span class="mf">40</span><span class="p">},</span><span class="w"> </span><span class="s2">"params"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"desired_fps"</span><span class="o">:</span><span class="w"> </span><span class="mf">30</span><span class="p">,</span><span class="w"> </span><span class="s2">"quality"</span><span class="o">:</span><span class="w"> </span><span class="mf">80</span><span class="p">},</span><span class="w"> </span><span class="s2">"snapshot"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"saved"</span><span class="o">:</span><span class="w"> </span><span class="kc">null</span><span class="p">},</span><span class="w"> </span><span class="s2">"streamer"</span><span class="o">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="s2">"features"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">"quality"</span><span class="o">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="s2">"resolution"</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="p">}}}</span>
|
|
<span class="p">{</span><span class="s2">"event_type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"loop"</span><span class="p">,</span><span class="w"> </span><span class="s2">"event"</span><span class="o">:</span><span class="w"> </span><span class="p">{}}</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<p>After connecting the client receives a bundle of states of all KVMD subsystems. After the batch is completed, it sends a <code>loop</code> event, which means that the websocket has entered event loop mode. Now it will send new states and respond to client's requests.</p>
|
|
<p>Another type of event is <code>ping</code>, which can be sent by the client: <code>{"event_type": "ping", "event": {}}</code>. If the server is running, it will respond with pong: <code>{"event_type": "pong", "event": {}}</code>.</p>
|
|
<details class="example">
|
|
<summary>Sending key events using Python</summary>
|
|
<p>For keypresses, set <code>event_type</code> to <code>key</code> and fill in the <code>event</code> structure with <code>key</code> and <code>state</code>, where <code>key</code> is the key from mapping and <code>state</code> is boolean that determines if the key is pressed or released: </p>
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># python, install websocket-client</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">websocket</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">ssl</span><span class="o">,</span><span class="w"> </span><span class="nn">time</span>
|
|
<span class="n">uri</span> <span class="o">=</span> <span class="s2">"wss://10.0.0.7/api/ws?stream=0"</span>
|
|
<span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"X-KVMD-User"</span><span class="p">:</span> <span class="s2">"admin"</span><span class="p">,</span> <span class="s2">"X-KVMD-Passwd"</span><span class="p">:</span> <span class="s2">"admin"</span><span class="p">}</span>
|
|
<span class="n">ws</span> <span class="o">=</span> <span class="n">websocket</span><span class="o">.</span><span class="n">WebSocket</span><span class="p">(</span><span class="n">sslopt</span><span class="o">=</span><span class="p">{</span><span class="s2">"cert_reqs"</span><span class="p">:</span> <span class="n">ssl</span><span class="o">.</span><span class="n">CERT_NONE</span><span class="p">})</span>
|
|
<span class="n">ws</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
|
|
<span class="c1"># Key codes: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values</span>
|
|
<span class="n">ws</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'{"event_type": "key", "event": {"key": "Enter", "state": true}}'</span><span class="p">)</span>
|
|
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.05</span><span class="p">)</span>
|
|
<span class="n">ws</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'{"event_type": "key", "event": {"key": "Enter", "state": false}}'</span><span class="p">)</span>
|
|
<span class="n">ws</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="system-functions">System functions<a class="headerlink" href="#system-functions" title="Permanent link">¶</a></h2>
|
|
<h3 id="get-system-info">Get system info<a class="headerlink" href="#get-system-info" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/info</code></p>
|
|
<p><strong>Description</strong>: Returns the general information about the PiKVM device.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>fields</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Return only specified categories</td>
|
|
<td><code>auth</code>, <code>extras</code>, <code>fan</code>, <code>hw</code>, <code>meta</code>, <code>system</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/info?fields<span class="o">=</span>hw
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"hw"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"health"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"cpu"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"percent"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"mem"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"available"</span><span class="p">:</span><span class="w"> </span><span class="mi">1568993280</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"percent"</span><span class="p">:</span><span class="w"> </span><span class="mf">14.6</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"total"</span><span class="p">:</span><span class="w"> </span><span class="mi">1836331008</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"temp"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"cpu"</span><span class="p">:</span><span class="w"> </span><span class="mf">45.277</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"throttling"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ignore_past"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"parsed_flags"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"freq_capped"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"now"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"past"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"throttled"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"now"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"past"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"undervoltage"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"now"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"past"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"raw_flags"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"platform"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"base"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Raspberry Pi 4 Model B Rev 1.5"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"board"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rpi4"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"v3"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"serial"</span><span class="p">:</span><span class="w"> </span><span class="s2">"10000000C8DA432D"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rpi"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"video"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hdmi"</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<p>Each category is represented by its own event in the websocket (<code>info_hw_state</code>, <code>info_system_state</code>, etc). The event content has the same format as the category content in the API.</p>
|
|
<h3 id="get-system-log">Get system log<a class="headerlink" href="#get-system-log" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/log</code></p>
|
|
<p><strong>Description</strong>: Displays logs from all KVMD services as plain text.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>follow</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Turns the request into long-polling mode and follow log messages in real time</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>seek</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Runs the log for the specified time in seconds</td>
|
|
<td><code>≥0</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>: the following query returns commit messages for the last 1 hour and enables the long-polling mode:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/log?follow=1&seek=3600'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code>[2025-06-10 22:38:07 kvmd.service] --- kvmd.apps.kvmd.auth INFO --- Authorized user 'admin' via auth service 'htpasswd'
|
|
[2025-06-10 22:38:15 kvmd.service] --- kvmd.apps.kvmd.auth INFO --- Authorized user 'admin' via auth service 'htpasswd'
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="hid">HID<a class="headerlink" href="#hid" title="Permanent link">¶</a></h2>
|
|
<p>The PiKVM HID (Human Interface Device) API provides remote control capabilities for keyboard and mouse input devices. It allows users to perform the following operations:</p>
|
|
<ul>
|
|
<li>Get the device state and set/reset parameters.</li>
|
|
<li>Send keyboard shortcuts and text to be typed in the host system.</li>
|
|
<li>Send various mouse events: move to absolute coordinates and relatively, click virtual mouse buttons, and scroll the virtual mouse wheel.</li>
|
|
</ul>
|
|
<h3 id="get-devices-state">Get devices state<a class="headerlink" href="#get-devices-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid</code></p>
|
|
<p><strong>Description</strong>: Gets the current HID devices state.</p>
|
|
<p><strong>Query parameters</strong>: none.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/hid
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"busy"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"connected"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"jiggler"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"active"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"interval"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"keyboard"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"leds"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"caps"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"num"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"scroll"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"outputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"active"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"available"</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"mouse"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"absolute"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"outputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"active"</span><span class="p">:</span><span class="w"> </span><span class="s2">"usb"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"available"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="s2">"usb"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"usb_rel"</span>
|
|
<span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-parameters">Set parameters<a class="headerlink" href="#set-parameters" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/set_params</code></p>
|
|
<p><strong>Description</strong>: Configures HID device parameters, such as the type of emulated keyboard and mouse.</p>
|
|
<p><strong>Query parameters</strong>:</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>keyboard_output</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Sets the type of the emulated keyboard</td>
|
|
<td><code>usb</code>, <code>ps2</code>, <code>disabled</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>mouse_output</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Sets the type of the emulated mouse</td>
|
|
<td><code>usb</code>, <code>usb_win98</code>, <code>usb_rel</code>, <code>ps2</code>, <code>disabled</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>jiggler</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Enable/disable <a href="../mouse_jiggler/">mouse jiggler</a> functionality</td>
|
|
<td><code>true</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/hid/set_params?jiggler<span class="o">=</span><span class="m">0</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-the-connected-state">Set the connected state<a class="headerlink" href="#set-the-connected-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/set_connected</code></p>
|
|
<p><strong>Description</strong>: Sets the HID devices connection state.</p>
|
|
<p><strong>Query parameters</strong>:</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>connected</code></td>
|
|
<td>boolean</td>
|
|
<td>required</td>
|
|
<td>Sets the connection state</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/hid/set_connected?connected<span class="o">=</span><span class="m">0</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="reset-devices-state">Reset devices' state<a class="headerlink" href="#reset-devices-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/reset</code></p>
|
|
<p><strong>Description</strong>: Resets HID devices to their initial state.</p>
|
|
<p><strong>Query parameters</strong>: none</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/hid/reset
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="get-keyboard-layouts">Get keyboard layouts<a class="headerlink" href="#get-keyboard-layouts" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/keymaps</code></p>
|
|
<p><strong>Description</strong>: Gets available keyboard layouts and the current defaults for use with <code>POST /api/hid/print</code>.</p>
|
|
<p><strong>Query parameters</strong>: none</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/hid/keymaps
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"keymaps"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"available"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="s2">"ar"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"bepo"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"cz"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"da"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"de"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"de-ch"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"en-gb"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"en-us"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"en-us-altgr-intl"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"en-us-colemak"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"es"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"et"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"fi"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"fo"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"fr"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"fr-be"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"fr-ca"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"fr-ch"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"hr"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"hu"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"is"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"it"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"ja"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"lt"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"lv"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"mk"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"nl"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"no"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"pl"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"pt"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"pt-br"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"ru"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"sl"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"sv"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"th"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"tr"</span>
|
|
<span class="w"> </span><span class="p">],</span>
|
|
<span class="w"> </span><span class="nt">"default"</span><span class="p">:</span><span class="w"> </span><span class="s2">"de"</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="type-text-remotely">Type text remotely<a class="headerlink" href="#type-text-remotely" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/print</code></p>
|
|
<p><strong>Description</strong>: Transmits user-defined text to emulate typing it on the PiKVM by sequencing key presses.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>limit</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Maximum characters to process</td>
|
|
<td>0 = no limit. No maximum value. Default: 1024</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>keymap</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Keymap to use (defaults to system default)</td>
|
|
<td>Any keymap listed in the output of <code>GET /hid/keymaps</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>slow</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Enables slow typing mode (regular large intervals between key presses), <code>false</code> by default</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>delay</code></td>
|
|
<td>float</td>
|
|
<td>optional</td>
|
|
<td>How many seconds to delay the transmission of keys by in the <code>slow</code> mode. Defaults to <code>0.02</code> when <code>slow</code> is enabled, otherwise defaults to <code>0</code></td>
|
|
<td><code>0..5.0</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-d<span class="w"> </span><span class="s2">"Einige Worte"</span><span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/hid/print?keymap<span class="o">=</span>de
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="send-a-keyboard-shortcut">Send a keyboard shortcut<a class="headerlink" href="#send-a-keyboard-shortcut" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/events/send_shortcut</code></p>
|
|
<p><strong>Description</strong>: Sends a keyboard shortcut, or key combination, to be typed on the PiKVM.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>keys</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Comma-separated list of key names</td>
|
|
<td>For a full list of supported values, please <a href="https://github.com/pikvm/kvmd/blob/master/keymap.csv">see here</a>. Use values from the <code>web_name</code> column</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/hid/events/send_shortcut?keys<span class="o">=</span>ControlLeft,KeyL
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="send-a-single-key-event">Send a single key event<a class="headerlink" href="#send-a-single-key-event" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/events/send_key</code></p>
|
|
<p><strong>Description</strong>: Transmits a command to emulate a single key press on the PiKVM.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>key</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Key identifier to send</td>
|
|
<td>For a full list of supported values, please <a href="https://github.com/pikvm/kvmd/blob/master/keymap.csv">see here</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Key state: <code>true</code> for press, <code>false</code> for release</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>finish</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Releases non-modifier keys right after pressing them so that they don't get stuck when the connection is not stable. Defaults to <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/hid/events/send_key?key<span class="o">=</span>Delete
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="send-mouse-button-events">Send mouse button events<a class="headerlink" href="#send-mouse-button-events" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/events/send_mouse_button</code></p>
|
|
<p><strong>Description</strong>: Sends mouse button press/release events.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>button</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Mouse button identifier</td>
|
|
<td><code>left</code>, <code>middle</code>, <code>right</code>, <code>up</code>, <code>down</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Mouse button state: <code>true</code> for press, <code>false</code> for release</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/hid/events/send_mouse_button?button<span class="o">=</span>left
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="move-the-mouse-pointer">Move the mouse pointer<a class="headerlink" href="#move-the-mouse-pointer" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/events/send_mouse_move</code></p>
|
|
<p><strong>Description</strong>: Sends a command to move the mouse pointer to user-defined coordinates where 0,0 is the center of the screen. Only works if the mouse mode is set to <code>absolute</code> in the configuration.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>to_x</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Target X coordinate</td>
|
|
<td>Any negative or positive integer value</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>to_y</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Target Y coordinate</td>
|
|
<td>Any negative or positive integer value</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/hid/send_mouse_move?to_x=0&to_y=50'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="move-the-mouse-ppinter-relatively">Move the mouse ppinter relatively<a class="headerlink" href="#move-the-mouse-ppinter-relatively" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/events/send_mouse_relative</code></p>
|
|
<p><strong>Description</strong>: Sends a command to move the mouse pointer by a relative offset in pixels. Only works if the mouse mode is set to <code>absolute</code> in the configuration.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>delta_x</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Horizontal movement delta</td>
|
|
<td>Any negative or positive integer value</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>delta_y</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Vertical movement delta</td>
|
|
<td>Any negative or positive integer value</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/hid/send_mouse_relative?delta_x=20&delta_y=200'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="send-mouse-wheel-scroll-events">Send mouse wheel scroll events<a class="headerlink" href="#send-mouse-wheel-scroll-events" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/hid/events/send_mouse_wheel</code></p>
|
|
<p><strong>Description</strong>: Sends mouse wheel scroll events to be emulated on the host by PiKVM.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>delta_x</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Horizontal scroll delta</td>
|
|
<td>Any negative or positive integer value</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>delta_y</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Vertical scroll delta</td>
|
|
<td>Any negative or positive integer value</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>: Sends mouse wheel scroll events.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/hid/send_mouse_wheel?delta_x=0&delta_y=200'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="atx-power-management">ATX power management<a class="headerlink" href="#atx-power-management" title="Permanent link">¶</a></h2>
|
|
<p>The PiKVM ATX API provides control over ATX (Advanced Technology eXtended) power management functions. It allows users perform the following operations:</p>
|
|
<ul>
|
|
<li>Get the current ATX state.</li>
|
|
<li>Change the ATX state.</li>
|
|
<li>Send an ATX button press event.</li>
|
|
</ul>
|
|
<h3 id="get-atx-state">Get ATX state<a class="headerlink" href="#get-atx-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/atx</code></p>
|
|
<p><strong>Description</strong>: Shows the current ATX state</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/atx
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"busy"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> </span><span class="c1">// True if ATX is busy performing an operation and does not accept commands</span>
|
|
<span class="w"> </span><span class="nt">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"leds"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"hdd"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"power"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-atx-power">Set ATX power<a class="headerlink" href="#set-atx-power" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/atx/power</code></p>
|
|
<p><strong>Description</strong>: Changes the ATX power state to desired.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>action</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Specifies desired state</td>
|
|
<td><code>on</code> - Turn on (do nothing in case PSU is already on). <code>off</code> - Turn off (aka soft-off), emulates click on the power button. <code>off_hard</code> - Perform long press on the power button (5+ seconds). <code>reset_hard</code> - Emulate pressing reset button (hardware hot reset)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wait</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Says if call should return immediately or just after finishing operation.</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/atx/power?action<span class="o">=</span>on
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="click-atx-button">Click ATX button<a class="headerlink" href="#click-atx-button" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/atx/click</code></p>
|
|
<p><strong>Description</strong>: Sends the ATX button press event.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>button</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Specifies the desired PC case button</td>
|
|
<td><code>power</code> - Short click on the power button. <code>power_long</code> - Long press on the power button (5+ seconds). <code>reset</code> - Short click on the reset button.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wait</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Says if call should return immediately or just after finishing operation.</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/atx/click?button<span class="o">=</span>power
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="mass-storage-drive">Mass Storage Drive<a class="headerlink" href="#mass-storage-drive" title="Permanent link">¶</a></h2>
|
|
<p>The PiKVM Mass Storage Drive API provides controls for remote management of disk images that can be mounted as virtual storage devices. It allows users perform the following operations:</p>
|
|
<ul>
|
|
<li>Get current MSD status and configuration</li>
|
|
<li>Upload, download, and delete disk images</li>
|
|
<li>Fetch disk images directly from URLs with progress streaming</li>
|
|
<li>Connect/disconnect virtual storages, enable CD-ROM and read-write modes</li>
|
|
<li>Set image names, access modes, and device type settings</li>
|
|
</ul>
|
|
<h3 id="get-msd-state">Get MSD state<a class="headerlink" href="#get-msd-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd</code></p>
|
|
<p><strong>Description</strong>: Retrieves the current state of the Mass Storage Device.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/msd
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"busy"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"drive"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"cdrom"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"connected"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"image"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"rw"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"storage"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"downloading"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"images"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
|
|
<span class="w"> </span><span class="nt">"parts"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">""</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"free"</span><span class="p">:</span><span class="w"> </span><span class="mi">24358789120</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">24375590912</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"writable"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"uploading"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="upload-msd-image">Upload MSD image<a class="headerlink" href="#upload-msd-image" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd/write</code></p>
|
|
<p><strong>Description</strong>: uploads an ISO to the Mass Storage Device.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>image</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Specifies the name of the image. Binary data should be passed to the POST body</td>
|
|
<td><code>filename.iso</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span><span class="c1"># create a test image</span>
|
|
<span class="gp">$ </span>dd<span class="w"> </span><span class="k">if</span><span class="o">=</span>/dev/zero<span class="w"> </span><span class="nv">of</span><span class="o">=</span>test.iso<span class="w"> </span><span class="nv">bs</span><span class="o">=</span>1M<span class="w"> </span><span class="nv">count</span><span class="o">=</span><span class="m">1</span>
|
|
|
|
<span class="gp">$ </span><span class="c1"># upload it to pikvm</span>
|
|
<span class="gp">$ </span>curl<span class="w"> </span>-v<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>--data-binary<span class="w"> </span>@test.iso<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/msd/write?image<span class="o">=</span>test.iso
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="upload-msd-image-by-url">Upload MSD image by URL<a class="headerlink" href="#upload-msd-image-by-url" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd/write_remote</code></p>
|
|
<p><strong>Description</strong>: Downloads an image from HTTP(S) URL to the MSD.</p>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
<p>This is a long-polling request. Do not interrupt the request until the download is complete, otherwise the download will stop.</p>
|
|
</div>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>url</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Image URL</td>
|
|
<td>Any URL using HTTP(S)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>image</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Image name</td>
|
|
<td>Any alphanumeric name like <code>image321.iso</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>timeout</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Remote request timeout, 10 seconds by default</td>
|
|
<td><code>≥0</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span><span class="c1"># create test image</span>
|
|
<span class="gp">$ </span>dd<span class="w"> </span><span class="k">if</span><span class="o">=</span>/dev/zero<span class="w"> </span><span class="nv">of</span><span class="o">=</span>test.iso<span class="w"> </span><span class="nv">bs</span><span class="o">=</span>1M<span class="w"> </span><span class="nv">count</span><span class="o">=</span><span class="m">1</span>
|
|
|
|
<span class="gp">$ </span><span class="c1"># upload it to pikvm</span>
|
|
<span class="gp">$ </span>curl<span class="w"> </span>-v<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/msd/write_remote?url<span class="o">=</span>http://example.com/test.iso
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-msd-parameters">Set MSD parameters<a class="headerlink" href="#set-msd-parameters" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd/set_params</code></p>
|
|
<p><strong>Description</strong>: Changes the current image and/or set drive parameters.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>image</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Change the current image</td>
|
|
<td><code>filename.iso</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>cdrom</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Change the media type to the CD-ROM or Flash.</td>
|
|
<td><code>1</code> (CD-ROM) or <code>0</code> (Flash)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>rw</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Sets read-write or read-only mode. Ignored (always read-only) when <code>cdrom=1</code></td>
|
|
<td><code>1</code> (read-write) or <code>0</code> (read-only)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/msd/set_params?image=test.iso&cdrom=1'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="control-msd">Control MSD<a class="headerlink" href="#control-msd" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd/set_connected</code></p>
|
|
<p><strong>Description</strong>: Connects or disconnects the MSD to/from the host.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>connected</code></td>
|
|
<td>boolean</td>
|
|
<td>required</td>
|
|
<td>Changes the state</td>
|
|
<td><code>1</code> connects the MSD, <code>0</code> disconnects it</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/msd/set_connected?connected<span class="o">=</span><span class="m">1</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="remove-msd-image">Remove MSD image<a class="headerlink" href="#remove-msd-image" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd/remove</code></p>
|
|
<p><strong>Description</strong>: Removes the specified image.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>image</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Name of the image to remove</td>
|
|
<td><code>filename.iso</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/msd/remove?image<span class="o">=</span>test.iso
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="reset-msd">Reset MSD<a class="headerlink" href="#reset-msd" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/msd/reset</code></p>
|
|
<p><strong>Description</strong>: Drops all the custom parameters you set before and resets the Mass Storage Device to its default state.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/msd/reset
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="gpio">GPIO<a class="headerlink" href="#gpio" title="Permanent link">¶</a></h2>
|
|
<p>This is a PiKVP API for controlling User GPIO (General Purpose Input/Output) pins. It allows users perform the following operations:</p>
|
|
<ul>
|
|
<li>Read GPIO states.</li>
|
|
<li>Switch pins on/off.</li>
|
|
<li>Send pulses to GPIO channels.</li>
|
|
</ul>
|
|
<h3 id="get-gpio-state">Get GPIO state<a class="headerlink" href="#get-gpio-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/gpio</code></p>
|
|
<p><strong>Description</strong>: Retrieves the current state of all GPIO channels.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/gpio
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"model"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"scheme"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"inputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
|
|
<span class="w"> </span><span class="nt">"outputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"__v3_usb_breaker__"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"hw"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"driver"</span><span class="p">:</span><span class="w"> </span><span class="s2">"__gpio__"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"pin"</span><span class="p">:</span><span class="w"> </span><span class="s2">"5"</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"pulse"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"delay"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"max_delay"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"min_delay"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.0</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"switch"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"view"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"header"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"title"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GPIO"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"label"</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"table"</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"state"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"inputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
|
|
<span class="w"> </span><span class="nt">"outputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"__v3_usb_breaker__"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"busy"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"state"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="switch-gpio-channel">Switch GPIO channel<a class="headerlink" href="#switch-gpio-channel" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/gpio/switch</code></p>
|
|
<p><strong>Description</strong>: Sets a GPIO channel to a specific state (on/off).</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>channel</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>The GPIO driver channel</td>
|
|
<td>Alphanumeric channel name, e.g., <code>__v3_usb_breaker__</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>boolean</td>
|
|
<td>required</td>
|
|
<td>The new switch state</td>
|
|
<td><code>1</code> to switch on, <code>0</code> to switch off</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wait</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Defines when a call should return</td>
|
|
<td><code>1</code> return immediately, <code>0</code> return after finishing operation</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp"># </span>Switch<span class="w"> </span>GPIO<span class="w"> </span>channel<span class="w"> </span>led1<span class="w"> </span>to<span class="w"> </span>OFF<span class="w"> </span>state<span class="w"> </span>without<span class="w"> </span>waiting
|
|
<span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/gpio/switch?channel<span class="o">=</span>led1<span class="p">&</span><span class="nv">state</span><span class="o">=</span><span class="m">0</span><span class="p">&</span><span class="nv">wait</span><span class="o">=</span><span class="m">0</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="pulse-gpio-channel">Pulse GPIO channel<a class="headerlink" href="#pulse-gpio-channel" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/gpio/pulse</code></p>
|
|
<p><strong>Description</strong>: Sends a pulse signal to a GPIO channel (briefly activates then deactivates). Only works for channels that support the pulse mode.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>channel</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>The GPIO driver channel</td>
|
|
<td>Alphanumeric channel name, e.g., <code>led1</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>delay</code></td>
|
|
<td>float</td>
|
|
<td>optional</td>
|
|
<td>The pulse time in seconds</td>
|
|
<td>Any float number, <code>0</code> for default delay</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wait</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Defines when a call should return</td>
|
|
<td><code>1</code> return immediately, <code>0</code> return after finishing operation</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp"># </span>Send<span class="w"> </span>a<span class="w"> </span>pulse<span class="w"> </span>to<span class="w"> </span>GPIO<span class="w"> </span>channel<span class="w"> </span>led1<span class="w"> </span>with<span class="w"> </span><span class="m">2</span><span class="w"> </span>sec<span class="w"> </span>delay<span class="w"> </span>without<span class="w"> </span>waiting
|
|
<span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/gpio/pulse?channel=led1&delay=2.0&wait=0'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="streamer">Streamer<a class="headerlink" href="#streamer" title="Permanent link">¶</a></h2>
|
|
<p>The PiKVM Streamer API provides remote access to video stream capture and management functionality of PiKVM devices. It allows users perform the following operations:</p>
|
|
<ul>
|
|
<li>Capture screenshots.</li>
|
|
<li>Perform optical character recognition (OCR) on captured images.</li>
|
|
<li>Monitor the streamer's operational status.</li>
|
|
</ul>
|
|
<h3 id="get-streamer-state">Get streamer state<a class="headerlink" href="#get-streamer-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/streamer</code></p>
|
|
<p><strong>Description</strong>: Retrieves the current state of the streamer.</p>
|
|
<p><strong>Query parameters</strong>: None</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/streamer
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"features"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"h264"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"quality"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"resolution"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"limits"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"desired_fps"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"max"</span><span class="p">:</span><span class="w"> </span><span class="mi">70</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"min"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"h264_bitrate"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"max"</span><span class="p">:</span><span class="w"> </span><span class="mi">20000</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"min"</span><span class="p">:</span><span class="w"> </span><span class="mi">25</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"h264_gop"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"max"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"min"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"params"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"desired_fps"</span><span class="p">:</span><span class="w"> </span><span class="mi">40</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"h264_bitrate"</span><span class="p">:</span><span class="w"> </span><span class="mi">5000</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"h264_gop"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"quality"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"snapshot"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"saved"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"streamer"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"encoder"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"quality"</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"M2M-IMAGE"</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"h264"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"bitrate"</span><span class="p">:</span><span class="w"> </span><span class="mi">5000</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"fps"</span><span class="p">:</span><span class="w"> </span><span class="mi">60</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"gop"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"instance_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"sinks"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"h264"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"has_clients"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"jpeg"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"has_clients"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"source"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"captured_fps"</span><span class="p">:</span><span class="w"> </span><span class="mi">59</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"desired_fps"</span><span class="p">:</span><span class="w"> </span><span class="mi">40</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"online"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"resolution"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"height"</span><span class="p">:</span><span class="w"> </span><span class="mi">720</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">1280</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"stream"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"clients"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"clients_stat"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
|
|
<span class="w"> </span><span class="nt">"queued_fps"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="take-snapshot">Take snapshot<a class="headerlink" href="#take-snapshot" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/streamer/snapshot</code></p>
|
|
<p><strong>Description</strong>: Captures a snapshot from the video stream. Can optionally perform OCR text recognition or generate a preview image. For optical character recognition, the coordinates origin starts at top left.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>save</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Whether to save the snapshot, default: <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>load</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Whether to load an existing snapshot, default: <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>allow_offline</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Whether to allow taking snapshots when offline, default: <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ocr</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Whether to perform OCR text recognition on the snapshot, default: <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ocr_langs</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>Comma-separated list of language codes for OCR recognition</td>
|
|
<td>Typically, a 3-letter code, such as <code>eng</code> for English or <code>deu</code> for German. Run <code>pacman -Ss tesseract-data</code> on PiKVM to get the full list</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ocr_left</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>X coordinate of the top left corner of the OCR region, default: <code>-1</code></td>
|
|
<td><code>≥0</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ocr_top</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Y coordinate of the top left corner of the OCR region, default: <code>-1</code></td>
|
|
<td><code>≥0</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ocr_right</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Width of the OCR region, default: <code>-1</code></td>
|
|
<td><code>≥0</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ocr_bottom</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Height of the OCR region, default: <code>-1</code></td>
|
|
<td><code>≥0</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>preview</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Whether to generate a preview image, default: <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>preview_max_width</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Maximum width for preview image, default: <code>0</code></td>
|
|
<td>Any positive integer value</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>preview_max_height</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Maximum height for preview image, default: <code>0</code></td>
|
|
<td>Any positive integer value</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>preview_quality</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>JPEG quality for preview (valid stream quality value), default: <code>80</code></td>
|
|
<td>Any integer value in the 0..100 range</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>: the following command will capture a snapshot of the current video stream and save it to a JPEG file.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/streamer/snapshot?save=1&preview_quality=95'</span><span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>--output<span class="o">=</span>file.jpg
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="gp"> % </span>Total<span class="w"> </span>%<span class="w"> </span>Received<span class="w"> </span>%<span class="w"> </span>Xferd<span class="w"> </span>Average<span class="w"> </span>Speed<span class="w"> </span>Time<span class="w"> </span>Time<span class="w"> </span>Time<span class="w"> </span>Current
|
|
<span class="go"> Dload Upload Total Spent Left Speed</span>
|
|
<span class="go">100 107k 100 107k 0 0 619k 0 --:--:-- --:--:-- --:--:-- 619k</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<p><strong>Example of use</strong>: the following command will capture a region of the current video stream (left corner starts at the top left, extends 1000px to the right and 150px to the bottom), run it through Tesseract for optical character recognition (language defined as English), and output the recognized text into the console.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/streamer/snapshot?ocr=true&ocr_left=0&ocr_top=0&ocr_right=1000&ocr_bottom=150&ocr_langs=eng'</span>
|
|
</code></pre></div>
|
|
<p><strong>Responses</strong>:</p>
|
|
<ul>
|
|
<li>When <code>ocr=true</code>:<ul>
|
|
<li>Content-Type: <code>text/plain</code></li>
|
|
<li>Body: Recognized text from the image</li>
|
|
</ul>
|
|
</li>
|
|
<li>When <code>preview=true</code> or default:<ul>
|
|
<li>Content-Type: <code>image/jpeg</code></li>
|
|
<li>Body: JPEG image data (either preview or full snapshot)</li>
|
|
</ul>
|
|
</li>
|
|
<li>When snapshot unavailable:<ul>
|
|
<li>Status: 503 Service Unavailable</li>
|
|
<li>Error: UnavailableError</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="remove-snapshot">Remove snapshot<a class="headerlink" href="#remove-snapshot" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>DELETE</code></p>
|
|
<p><strong>Route</strong>: <code>/api/streamer/snapshot</code></p>
|
|
<p><strong>Description</strong>: Removes/deletes the current snapshot from memory.</p>
|
|
<p><strong>Query parameters</strong>: None</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>DELETE<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/streamer/snapshot
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
|
|
<span class="p">}</span><span class="err">⏎</span><span class="w"> </span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="get-ocr-state">Get OCR state<a class="headerlink" href="#get-ocr-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: GET</p>
|
|
<p><strong>Route</strong>: <code>/api/streamer/ocr</code></p>
|
|
<p><strong>Description</strong>: Retrieves the current state and configuration of the optical character recognition (OCR) service.</p>
|
|
<p><strong>Query parameters</strong>: None</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/streamer/ocr
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ok"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"result"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ocr"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"langs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"available"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="s2">"eng"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"osd"</span>
|
|
<span class="w"> </span><span class="p">],</span>
|
|
<span class="w"> </span><span class="nt">"default"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="s2">"eng"</span>
|
|
<span class="w"> </span><span class="p">]</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="switch">Switch<a class="headerlink" href="#switch" title="Permanent link">¶</a></h2>
|
|
<p>The PiKVM Switch API provides handles to control the <a href="../switch/">PiKVM Switch</a>: get information, set active ports, and control beacons.</p>
|
|
<p>The API heavily relies on specifying ports on the PiKVM Switch. There are two ways to do that: with continuous numbering or with float numbers. Both options are equally valid and supported.</p>
|
|
<ol>
|
|
<li>With continuous numbering, ports enumeration starts at 0 and ends at 19, because you can create up to 20 ports by adding more PiKVM Switch devices to the first Switch's downlink.</li>
|
|
<li>If you use a float value, the integer part specifies the number of the unit in the downlink, while the fractional part specifies the number of the port on that unit.</li>
|
|
</ol>
|
|
<h3 id="get-switch-state">Get Switch state<a class="headerlink" href="#get-switch-state" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch</code></p>
|
|
<p><strong>Description</strong>: Returns the information about the PiKVM Switch state.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/switch
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-active-port-previous">Set active port (previous)<a class="headerlink" href="#set-active-port-previous" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/set_active_prev</code></p>
|
|
<p><strong>Description</strong>: Switches to the previous active port.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/switch/set_active_prev
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-active-port-next">Set active port (next)<a class="headerlink" href="#set-active-port-next" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/set_active_next</code></p>
|
|
<p><strong>Description</strong>: Switches to the next active port.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/switch/set_active_next
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-active-port-specific">Set active port (specific)<a class="headerlink" href="#set-active-port-specific" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/set_active</code></p>
|
|
<p><strong>Description</strong>: Switches to a specific port.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>port</code></td>
|
|
<td>float</td>
|
|
<td>required</td>
|
|
<td>Specifies the port number</td>
|
|
<td>Integer in the 0..19 range or float (0,0 through 4,3)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/switch/set_active?port<span class="o">=</span><span class="m">2</span>,2
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-beacon">Set beacon<a class="headerlink" href="#set-beacon" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/set_beacon</code></p>
|
|
<p><strong>Description</strong>: Controls beacon lights on ports or uplink/downlink units.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>boolean</td>
|
|
<td>required</td>
|
|
<td>Turn beacon on/off</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>port</code></td>
|
|
<td>float</td>
|
|
<td>optional</td>
|
|
<td>Specify the port beacon</td>
|
|
<td>Integer in the 0..19 range or float (0,0 through 4,3)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>uplink</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Number of the uplink beacon, same as the port</td>
|
|
<td>Integer in the 0..19 range or float (0,0 through 4,3)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>downlink</code></td>
|
|
<td>integer</td>
|
|
<td>optional</td>
|
|
<td>Number of the downlink beacon, same as the port</td>
|
|
<td>Integer in the 0..19 range or float (0,0 through 4,3)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/switch/set_beacon
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-port-parameters">Set port parameters<a class="headerlink" href="#set-port-parameters" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/set_port_params</code></p>
|
|
<p><strong>Description</strong>: Configures parameters for a specific port.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>port</code></td>
|
|
<td>float</td>
|
|
<td>required</td>
|
|
<td>Specifies the port number</td>
|
|
<td><code>0..19</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>edid_id</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>EDID identifier (allows default value)</td>
|
|
<td>Alphanumeric string like <code>ca3d7114-79ca-47fc-80b4-b80ac63fc329</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>dummy</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>When enabled, the switch will pretend the host has a display attached</td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>name</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>String port name, none set by default</td>
|
|
<td>Any combination of ASCII letters and numbers</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>atx_click_power_delay</code></td>
|
|
<td>float</td>
|
|
<td>optional</td>
|
|
<td>ATX power click delay value</td>
|
|
<td><code>0..10</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>atx_click_power_long_delay</code></td>
|
|
<td>float</td>
|
|
<td>optional</td>
|
|
<td>ATX long power click delay value</td>
|
|
<td><code>0..10</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>atx_click_reset_delay</code></td>
|
|
<td>float</td>
|
|
<td>optional</td>
|
|
<td>ATX reset click delay value</td>
|
|
<td><code>0..10</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/switch/set_port_params?port=2&name=PORT3'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="set-beacon-color">Set beacon color<a class="headerlink" href="#set-beacon-color" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/set_colors</code></p>
|
|
<p><strong>Description</strong>: Sets the beacon color for the PiKVM Switch and all switches in the downlink (where applicable).</p>
|
|
<p><strong>Query parameters</strong>:</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>beacon</code></td>
|
|
<td>hex</td>
|
|
<td>required</td>
|
|
<td>Sets color, brightness, and blink interval (ms)</td>
|
|
<td>A valid hex value (see example below)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>: Let's set the beacon to be orange at 75% of full brightness, blinking with an interval of 40ms.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-d<span class="w"> </span><span class="s2">"FFA500:BF:0028"</span><span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/switch/set_colors
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="reboot-the-device">Reboot the device<a class="headerlink" href="#reboot-the-device" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/reset</code></p>
|
|
<p><strong>Description</strong>: Reboots the PiKVM Switch with an option to enter the reflashing mode after the reboot.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>unit</code></td>
|
|
<td>integer</td>
|
|
<td>required</td>
|
|
<td>Specifies the unit number</td>
|
|
<td><code>0..4</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>bootloader</code></td>
|
|
<td>boolean</td>
|
|
<td>optional</td>
|
|
<td>Whether to enter the reflashing mode after rebooting, defaults to <code>false</code></td>
|
|
<td>Enable: <code>1</code>, <code>true</code>, or <code>yes</code>. Disable: <code>0</code>, <code>false</code>, or <code>no</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/switch/reset?unit=0&bootloader=1'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="create-a-new-edid-configuration">Create a new EDID configuration<a class="headerlink" href="#create-a-new-edid-configuration" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/edids/create</code></p>
|
|
<p><strong>Description</strong>: Creates a new EDID configuration from user-specified EDID name and data.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>name</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>EDID name</td>
|
|
<td>Alphanumeric name (see example below)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>data</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>EDID data</td>
|
|
<td>Hexadecimal string (see example below)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/switch/edids/create?name=Gigabyte-GA-H77-DS3H&data=00FFFFFFFFFFFF0052628888008888881C150103800000780AEE91A3544C99260F505425400001000100010001000100010001010101D51B0050500019400820B80080001000001EEC2C80A070381A403020350040442100001E000000FC0050492D4B564D20566964656F0A000000FD00323D0F2E0F0000000000000000014D02030400DE0D20A03058122030203400F0B400000018E01500A04000163030203400000000000018B41400A050D011203020350080D810000018AB22A0A050841A3030203600B00E1100001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="change-edid-configuration">Change EDID configuration<a class="headerlink" href="#change-edid-configuration" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/edids/change</code></p>
|
|
<p><strong>Description</strong>: Modifies an existing EDID configuration.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>id</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>EDID identifier</td>
|
|
<td>Alphanumeric id (see example below)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>name</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>New EDID name</td>
|
|
<td>Alphanumeric name (see example below)</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>data</code></td>
|
|
<td>string</td>
|
|
<td>optional</td>
|
|
<td>New EDID data</td>
|
|
<td>Hexadecimal string (see example below)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/switch/edids/change?id=ca3d7114-79ca-47fc-80b4-b80ac63fc329&name=Gigabyte-GA-H77-DS3H&data=00FFFFFFFFFFFF0052628888008888881C150103800000780AEE91A3544C99260F505425400001000100010001000100010001010101D51B0050500019400820B80080001000001EEC2C80A070381A403020350040442100001E000000FC0050492D4B564D20566964656F0A000000FD00323D0F2E0F0000000000000000014D02030400DE0D20A03058122030203400F0B400000018E01500A04000163030203400000000000018B41400A050D011203020350080D810000018AB22A0A050841A3030203600B00E1100001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="remove-edid-configuration">Remove EDID configuration<a class="headerlink" href="#remove-edid-configuration" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/edids/remove</code></p>
|
|
<p><strong>Description</strong>: Deletes an EDID configuration.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>id</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>EDID identifier</td>
|
|
<td>Alphanumeric id (see example below)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/switch/edids/remove?id<span class="o">=</span>ca3d7114-79ca-47fc-80b4-b80ac63fc329
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="atx-power-control">ATX Power Control<a class="headerlink" href="#atx-power-control" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/atx/power</code></p>
|
|
<p><strong>Description</strong>: Controls ATX power states for a specific port.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>port</code></td>
|
|
<td>float</td>
|
|
<td>required</td>
|
|
<td>Specifies the port number</td>
|
|
<td>0..19</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>action</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Power action</td>
|
|
<td><code>on</code> - Power on, <code>off</code> - Power off, <code>off_hard</code> - Hard power off, <code>reset_hard</code> - Hard reset</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/switch/atx/power?port=0&action=reset_hard'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="atx-button-click">ATX Button Click<a class="headerlink" href="#atx-button-click" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/switch/atx/click</code></p>
|
|
<p><strong>Description</strong>: Simulates ATX button clicks for a specific port.</p>
|
|
<p><strong>Query parameters</strong>: </p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Type</th>
|
|
<th>Optionality</th>
|
|
<th>Description</th>
|
|
<th>Acceptable values</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>port</code></td>
|
|
<td>float</td>
|
|
<td>required</td>
|
|
<td>Specifies the port number</td>
|
|
<td><code>0..19</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>button</code></td>
|
|
<td>string</td>
|
|
<td>required</td>
|
|
<td>Power action</td>
|
|
<td><code>power</code> - Power button click, <code>power_long</code> - Long power button press, <code>reset</code> - Reset button click</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span><span class="s1">'https://<pikvm-ip>/api/switch/atx/click?port=0&button=power_long'</span>
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="err">FIXME</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<hr>
|
|
<h2 id="redfish">Redfish<a class="headerlink" href="#redfish" title="Permanent link">¶</a></h2>
|
|
<p>The PiKVM Redfish API implements the industry-standard <a href="https://www.dmtf.org/standards/redfish">DMTF Redfish specification</a> for remote server control. It allows you to monitor and control the power of the target system.</p>
|
|
<p>Most endpoints require authentication using your PiKVM credentials. You can interact with the API using standard HTTP clients, <code>curl</code>, or the <a href="https://github.com/DMTF/Redfishtool">specialized Redfish tools</a>.</p>
|
|
<h3 id="root-service-discovery">Root service discovery<a class="headerlink" href="#root-service-discovery" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/redfish/v1</code></p>
|
|
<p><strong>Description</strong>: Returns the basic Redfish service information and links to available resources. Doesn't require authentication.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>https://<pikvm-ip>/api/redfish/v1
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"@odata.id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"@odata.type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#ServiceRoot.v1_6_0.ServiceRoot"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"RootService"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Root Service"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"RedfishVersion"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.6.0"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Systems"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"@odata.id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1/Systems"</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="systems-collection">Systems collection<a class="headerlink" href="#systems-collection" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/redfish/v1/Systems</code></p>
|
|
<p><strong>Description</strong>: Returns collection of available computer systems.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/redfish/v1/Systems
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"@odata.id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1/Systems"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"@odata.type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#ComputerSystemCollection.ComputerSystemCollection"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Members"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"@odata.id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1/Systems/0"</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">],</span>
|
|
<span class="w"> </span><span class="nt">"Members@odata.count"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Computer System Collection"</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="individual-system-information">Individual system information<a class="headerlink" href="#individual-system-information" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>GET</code></p>
|
|
<p><strong>Route</strong>: <code>/api/redfish/v1/Systems/0</code></p>
|
|
<p><strong>Description</strong>: Returns detailed information about the specific system, including power state, hostname, and available actions.</p>
|
|
<p><strong>Query parameters</strong>: None.</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/redfish/v1/Systems/0
|
|
</code></pre></div>
|
|
<details class="note">
|
|
<summary>Example output</summary>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"@odata.id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1/Systems/0"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"@odata.type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#ComputerSystem.v1_10_0.ComputerSystem"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Actions"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"#ComputerSystem.Reset"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"ResetType@Redfish.AllowableValues"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="s2">"On"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"ForceOff"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"GracefulShutdown"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"ForceRestart"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"ForceOn"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="s2">"PushPowerButton"</span>
|
|
<span class="w"> </span><span class="p">],</span>
|
|
<span class="w"> </span><span class="nt">"target"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1/Systems/0/Actions/ComputerSystem.Reset"</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"#ComputerSystem.SetDefaultBootOrder"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"target"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/redfish/v1/Systems/0/Actions/ComputerSystem.SetDefaultBootOrder"</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"Boot"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nt">"BootSourceOverrideEnabled"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Disabled"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"BootSourceOverrideTarget"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
|
|
<span class="w"> </span><span class="p">},</span>
|
|
<span class="w"> </span><span class="nt">"HostName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pikvm"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"Id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nt">"PowerState"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Off"</span>
|
|
<span class="p">}</span><span class="err">⏎</span>
|
|
</code></pre></div>
|
|
</details>
|
|
<h3 id="system-configuration-update">System configuration update<a class="headerlink" href="#system-configuration-update" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>PATCH</code></p>
|
|
<p><strong>Route</strong>: <code>/api/redfish/v1/Systems/0</code></p>
|
|
<p><strong>Description</strong>: This handle was added to aid in scenarios where installing OKD (Kubernetes) using installer-provisioned infrastructure involves expecting two fields to be returned and the patch request to return a 204. Hence, this handle is currently a no-op that just returns success.</p>
|
|
<p><strong>Query parameters</strong>: None</p>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>PATCH<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/redfish/v1/Systems/0
|
|
</code></pre></div>
|
|
<p>There will be zero output for this command by design.</p>
|
|
<p><strong>Responses</strong>:</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Code</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>204</td>
|
|
<td>Returns success</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="system-power-control">System power control<a class="headerlink" href="#system-power-control" title="Permanent link">¶</a></h3>
|
|
<p><strong>Method</strong>: <code>POST</code></p>
|
|
<p><strong>Route</strong>: <code>/api/redfish/v1/Systems/0/Actions/ComputerSystem.Reset</code></p>
|
|
<p><strong>Description</strong>: Performs power control actions on the system.</p>
|
|
<p><strong>Query parameters</strong>: This handles expects JSON with <code>ResetType</code> in the request body and one of the following values:</p>
|
|
<ul>
|
|
<li><code>On</code> - Power on</li>
|
|
<li><code>ForceOff</code> - Hard power off</li>
|
|
<li><code>GracefulShutdown</code> - Graceful power off</li>
|
|
<li><code>ForceRestart</code> - Hard reset</li>
|
|
<li><code>ForceOn</code> - Force power on</li>
|
|
<li><code>PushPowerButton</code> - Simulate power button press</li>
|
|
</ul>
|
|
<p><strong>Example of use</strong>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-H<span class="w"> </span><span class="s2">"Content-Type: application/json"</span><span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>-d<span class="w"> </span><span class="s1">'{"ResetType": "ForceRestart"}'</span><span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>https://<pikvm-ip>/api/redfish/v1/Systems/0/Actions/ComputerSystem.Reset
|
|
</code></pre></div>
|
|
<p>There will be zero output for this command by design.</p>
|
|
<p><strong>Responses</strong>:</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Code</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>204</td>
|
|
<td>Success</td>
|
|
</tr>
|
|
<tr>
|
|
<td>400</td>
|
|
<td>Invalid or missing ResetType</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<hr>
|
|
<h2 id="misc">Misc<a class="headerlink" href="#misc" title="Permanent link">¶</a></h2>
|
|
<h3 id="get-prometheus-metrics">Get Prometheus metrics<a class="headerlink" href="#get-prometheus-metrics" title="Permanent link">¶</a></h3>
|
|
<p>The <code>GET /api/export/prometheus/metrics</code> handle returns the Prometheus metrics. Also see <a href="../prometheus/">here</a> for details.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>curl<span class="w"> </span>-k<span class="w"> </span>-u<span class="w"> </span>admin:admin<span class="w"> </span>https://<pikvm-ip>/api/export/prometheus/metrics
|
|
</code></pre></div>
|
|
<hr>
|
|
<h2 id="video">Video<a class="headerlink" href="#video" title="Permanent link">¶</a></h2>
|
|
<p>PiKVM has 3 different ways to receive video and audio, depending on the device.
|
|
This is also <a href="../video/">reflected</a> in the web interface.</p>
|
|
<p>| Mode |</p>
|
|
<h3 id="get-raw-h264-video-stream">Get raw H.264 video stream<a class="headerlink" href="#get-raw-h264-video-stream" title="Permanent link">¶</a></h3></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
|
|
|
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
|
</div>
|
|
|
|
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"></path></svg>
|
|
Back to top
|
|
</button>
|
|
|
|
</main>
|
|
|
|
<footer class="md-footer">
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-copyright">
|
|
|
|
<div class="md-copyright__highlight">
|
|
Copyright © 2018-2025 Maxim Devaev
|
|
</div>
|
|
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
Material for MkDocs
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
<div class="md-dialog" data-md-component="dialog">
|
|
<div class="md-dialog__inner md-typeset"></div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.indexes", "navigation.sections", "navigation.top", "navigation.expand", "search.highlight", "search.share", "search.suggest", "content.code.copy"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
|
|
|
|
|
<script src="../assets/javascripts/bundle.f55a23d4.min.js"></script>
|
|
|
|
<script src="../_assets/add_paragraphs.js"></script>
|
|
|
|
<script src="../_assets/scroll_to_summary.js"></script>
|
|
|
|
|
|
|
|
<script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": false, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
|
|
document$.subscribe(()=>{ lightbox.reload(); });
|
|
</script></body></html> |