UNPKG

vtally

Version:

An affordable and reliable Tally Light that works via WiFi based on NodeMCU / ESP8266. Supports multiple video mixers.

853 lines (552 loc) 27.9 kB
<!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="A low-cost, high-reliable Open Source WiFi Tally Light"> <link rel="canonical" href="https://wifi-tally.github.io/getting-started/setup-wifi-tally.html"> <link rel="icon" href="../images/favicon.png"> <meta name="generator" content="mkdocs-1.2.3, mkdocs-material-8.1.9"> <title>Build and set up a WiFi Tally - vTally – Open Source Tally Light</title> <link rel="stylesheet" href="../assets/stylesheets/main.2b4465f4.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.e6a45f82.min.css"> <script>__md_scope=new URL("..",location),__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> </head> <body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none"> <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="#build-and-set-up-a-wifi-tally" class="md-skip"> Skip to content </a> </div> <div data-md-component="announce"> </div> <header class="md-header" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="Header"> <a href="../index.html" title="vTally – Open Source Tally Light" class="md-header__button md-logo" aria-label="vTally – Open Source Tally Light" data-md-component="logo"> <img src="../images/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 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></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"> vTally – Open Source Tally Light </span> </div> <div class="md-header__topic" data-md-component="header-topic"> <span class="md-ellipsis"> Build and set up a WiFi Tally </span> </div> </div> </div> <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.516 6.516 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 5z"/></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.516 6.516 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 5z"/></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 11h12z"/></svg> </label> <nav class="md-search__options" aria-label="Search"> <button type="reset" class="md-search__icon md-icon" 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 12 19 6.41z"/></svg> </button> </nav> </form> <div class="md-search__output"> <div class="md-search__scrollwrap" 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"></ol> </div> </div> </div> </div> </div> <div class="md-header__source"> <a href="https://github.com/wifi-tally/wifi-tally/" 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"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class="md-source__repository"> GitHub </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="../index.html" title="vTally – Open Source Tally Light" class="md-nav__button md-logo" aria-label="vTally – Open Source Tally Light" data-md-component="logo"> <img src="../images/logo.png" alt="logo"> </a> vTally – Open Source Tally Light </label> <div class="md-nav__source"> <a href="https://github.com/wifi-tally/wifi-tally/" 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"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class="md-source__repository"> GitHub </div> </a> </div> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../index.html" class="md-nav__link"> Open Source Tally Light </a> </li> <li class="md-nav__item"> <a href="../download.html" class="md-nav__link"> Installation </a> </li> <li class="md-nav__item"> <a href="../protocol.html" class="md-nav__link"> Protocol </a> </li> <li class="md-nav__item"> <a href="../tally.html" class="md-nav__link"> Tally </a> </li> <li class="md-nav__item"> <a href="../troubleshooting.html" class="md-nav__link"> Troubleshooting </a> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" checked> <label class="md-nav__link" for="__nav_6"> Getting started <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" aria-label="Getting started" data-md-level="1"> <label class="md-nav__title" for="__nav_6"> <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="index.html" class="md-nav__link"> Getting started </a> </li> <li class="md-nav__item"> <a href="setup-hub.html" class="md-nav__link"> Set up the hub </a> </li> <li class="md-nav__item"> <a href="setup-web-tally.html" class="md-nav__link"> Set up a Web Tally </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> Build and set up a WiFi Tally <span class="md-nav__icon md-icon"></span> </label> <a href="setup-wifi-tally.html" class="md-nav__link md-nav__link--active"> Build and set up a WiFi Tally </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="#requirements" class="md-nav__link"> Requirements </a> <nav class="md-nav" aria-label="Requirements"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#a-nodemcu-esp8266" class="md-nav__link"> a NodeMcu ESP8266 </a> </li> <li class="md-nav__item"> <a href="#a-piece-of-rgb-led-strip" class="md-nav__link"> a piece of RGB LED strip </a> </li> <li class="md-nav__item"> <a href="#an-usb-power-source" class="md-nav__link"> an USB power source </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#connect-the-hardware" class="md-nav__link"> Connect the hardware </a> <nav class="md-nav" aria-label="Connect the hardware"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#separate-operator-and-stage-light" class="md-nav__link"> Separate Operator and Stage Light </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#prepare-the-nodemcu-toolchain" class="md-nav__link"> Prepare the NodeMCU Toolchain </a> </li> <li class="md-nav__item"> <a href="#flash-the-firmware" class="md-nav__link"> Flash the firmware </a> </li> <li class="md-nav__item"> <a href="#upload-code" class="md-nav__link"> Upload Code </a> </li> <li class="md-nav__item"> <a href="#conclusion" class="md-nav__link"> Conclusion </a> </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="#requirements" class="md-nav__link"> Requirements </a> <nav class="md-nav" aria-label="Requirements"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#a-nodemcu-esp8266" class="md-nav__link"> a NodeMcu ESP8266 </a> </li> <li class="md-nav__item"> <a href="#a-piece-of-rgb-led-strip" class="md-nav__link"> a piece of RGB LED strip </a> </li> <li class="md-nav__item"> <a href="#an-usb-power-source" class="md-nav__link"> an USB power source </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#connect-the-hardware" class="md-nav__link"> Connect the hardware </a> <nav class="md-nav" aria-label="Connect the hardware"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#separate-operator-and-stage-light" class="md-nav__link"> Separate Operator and Stage Light </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#prepare-the-nodemcu-toolchain" class="md-nav__link"> Prepare the NodeMCU Toolchain </a> </li> <li class="md-nav__item"> <a href="#flash-the-firmware" class="md-nav__link"> Flash the firmware </a> </li> <li class="md-nav__item"> <a href="#upload-code" class="md-nav__link"> Upload Code </a> </li> <li class="md-nav__item"> <a href="#conclusion" class="md-nav__link"> Conclusion </a> </li> </ul> </nav> </div> </div> </div> <div class="md-content" data-md-component="content"> <article class="md-content__inner md-typeset"> <a href="https://github.com/wifi-tally/wifi-tally/edit/master/documentation/docs/getting-started/setup-wifi-tally.md" title="Edit this page" class="md-content__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg> </a> <h1 id="build-and-set-up-a-wifi-tally">Build and set up a WiFi Tally<a class="headerlink" href="#build-and-set-up-a-wifi-tally" title="Permanent link">&para;</a></h1> <p>The WiFi Tally is a piece of hardware that connects to the Hub via WiFi.</p> <p>You do not need any prior experience with hardware projects as this is really beginner friendly.</p> <div class="admonition info"> <p class="admonition-title">Info</p> <p>Please note that this is the Getting Started Guide, and we follow <em>one</em> opinionated path here. We don't want to confuse new readers with too many options and alternate paths to choose from. If you are curious about alternatives, check out details in the <a href="../tally.html">reference</a>.</p> </div> <h2 id="requirements">Requirements<a class="headerlink" href="#requirements" title="Permanent link">&para;</a></h2> <p>You need a few parts to build the WiFi Tally.</p> <h3 id="a-nodemcu-esp8266">a NodeMcu ESP8266<a class="headerlink" href="#a-nodemcu-esp8266" title="Permanent link">&para;</a></h3> <p>This is an ESP8266 wifi chip on a development board that is typically used for IoT applications. As it is an Open Hardware project there are lots of different boards available. They mostly differ in price and form factor and are all fit for the project. But they all look similar to this:</p> <p><img alt="Photography of a NodeMCU" src="../images/Nodemcu_amica_bot_02.jpg" /></p> <p><a href="https://commons.wikimedia.org/wiki/File:Nodemcu_amica_bot_02.png">"NodeMCU Amica"</a> by "Make Magazin DE", <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC-BY-SA-4.0</a></p> <p>!TODO: elaborate on different NodeMCUs!</p> <h3 id="a-piece-of-rgb-led-strip">a piece of RGB LED strip<a class="headerlink" href="#a-piece-of-rgb-led-strip" title="Permanent link">&para;</a></h3> <p>It needs to be specified for 5V and have a common anode. Most LED strips that can be separated after <em>every</em> LED and have 4 pins should fulfill that requirement. </p> <p>I recommend taking one with 120LEDs per meter to not have the LEDS be spaced too much.</p> <h3 id="an-usb-power-source">an USB power source<a class="headerlink" href="#an-usb-power-source" title="Permanent link">&para;</a></h3> <p>The whole setup draws far less than <code>200mA</code> and can be powered via USB.</p> <ul> <li>Some cameras have USB outlets that you can use</li> <li><code>200mA</code> is little enough that even the smallest power bank can supply the Tally for hours</li> <li>use any old USB charger</li> </ul> <h2 id="connect-the-hardware">Connect the hardware<a class="headerlink" href="#connect-the-hardware" title="Permanent link">&para;</a></h2> <p>All you need to do is connecting the LED strip to the NodeMCU board.</p> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>Do not connect more than 5 LEDs to the board!</p> <p>This will drain too much current through the board and potentially damaging it.</p> </div> <p><img alt="connection of the parts" src="../images/tally-schematics-simple.png" /></p> <table> <thead> <tr> <th>board PIN</th> <th>strip PIN</th> </tr> </thead> <tbody> <tr> <td>D3</td> <td>B</td> </tr> <tr> <td>D2</td> <td>R</td> </tr> <tr> <td>D1</td> <td>G</td> </tr> <tr> <td>3V3</td> <td>+ or +5V</td> </tr> </tbody> </table> <div class="admonition info"> <p class="admonition-title">Info</p> <p>It is possible to connect the <code>+5V</code> pin of the LED strip to <code>Vin</code> on the board. But not all NodeMCU boards connect the PIN to the USB power supply and your LEDs would stay dark.</p> <p>It might also happen that you LED Strip does not work with a lower voltage of the 3.3V output. Typically this does not happen, but it could if you have an older strips.</p> </div> <p>This is how the setup could look like on a breadboard.</p> <p><img alt="WiFi Tally on a breaboard" src="../images/on-breadboard.jpg" /></p> <h3 id="separate-operator-and-stage-light">Separate Operator and Stage Light<a class="headerlink" href="#separate-operator-and-stage-light" title="Permanent link">&para;</a></h3> <p>You can connect a second strip to use as an indicator for the speaker on stage. Connect the first LED as above and direct it in the direction of the camera operator. Then connect a second strip and let it face to the front of the camera. </p> <p><img alt="connection of the parts" src="../images/tally-schematics-operator.png" /></p> <table> <thead> <tr> <th>board PIN</th> <th>strip PIN</th> </tr> </thead> <tbody> <tr> <td>D7</td> <td>B</td> </tr> <tr> <td>D6</td> <td>R</td> </tr> <tr> <td>D5</td> <td>G</td> </tr> <tr> <td>3V3</td> <td>+ or +5V</td> </tr> </tbody> </table> <p>This light will only show preview and live states, but not any error states.</p> <h2 id="prepare-the-nodemcu-toolchain">Prepare the NodeMCU Toolchain<a class="headerlink" href="#prepare-the-nodemcu-toolchain" title="Permanent link">&para;</a></h2> <p>The NodeMCU documentation very nicely explains all the steps necessary to <a href="https://nodemcu.readthedocs.io/en/master/getting-started/#getting-started-aka-nodemcu-quick-start">start a NodeMCU project</a>. The documentation might seem overwhelming at first, but you only need to care of the two steps</p> <ul> <li>Flash Firmware, and</li> <li>Upload code</li> </ul> <p>Depending on your Operating System, you should select one – and only one – <a href="https://nodemcu.readthedocs.io/en/master/getting-started/#task-os-selector">tool for each of these steps from the table</a>.</p> <p>So either select <a href="https://nodemcu.readthedocs.io/en/master/getting-started/#nodemcu-pyflasher">NodeMCU PyFlasher</a> or <a href="https://nodemcu.readthedocs.io/en/master/getting-started/#esptoolpy">esptool.py</a> to flash the firmware and follow their installation instruction. Similarly select <a href="https://nodemcu.readthedocs.io/en/master/getting-started/#esplorer">ESPlorer</a> or <a href="https://nodemcu.readthedocs.io/en/master/getting-started/#nodemcu-tool">NodeMCU Tool</a> to upload code and follow their installation instruction.</p> <p>Download <a href="https://github.com/wifi-tally/wifi-tally/releases/download/0.5.2/vtally-0.5.2-esp8266.zip">vtally-0.5.2-esp8266.zip</a> for the latest files for the ESP8266.</p> <h2 id="flash-the-firmware">Flash the firmware<a class="headerlink" href="#flash-the-firmware" title="Permanent link">&para;</a></h2> <p>When everything is set up flash the firmware with the tool selected in the previous step.</p> <p>The firmware is the <code>.bin</code> file in <a href="https://github.com/wifi-tally/wifi-tally/releases/download/0.5.2/vtally-0.5.2-esp8266.zip">vtally-0.5.2-esp8266.zip</a>.</p> <h2 id="upload-code">Upload Code<a class="headerlink" href="#upload-code" title="Permanent link">&para;</a></h2> <p>Use the tool you have selected to upload the following files from <a href="https://github.com/wifi-tally/wifi-tally/releases/download/0.5.2/vtally-0.5.2-esp8266.zip">vtally-0.5.2-esp8266.zip</a> to the NodeMCU board:</p> <ul> <li>every file ending in <code>.lc</code></li> <li><code>init.lua</code></li> <li>the <code>tally-settings.ini</code> described below</li> </ul> <div class="admonition info"> <p class="admonition-title">tally-settings.ini</p> <p>This file configures your Tally. You can copy <code>tally-settings.ini.example</code> over and edit it as needed.</p> <table> <thead> <tr> <th>setting name</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><code>station.ssid</code></td> <td>The name of the WiFi that the Tally should connect to</td> </tr> <tr> <td><code>station.password</code></td> <td>The password to connect to the WiFi. If the WiFi has no password, leave it empty.</td> </tr> <tr> <td><code>hub.ip</code></td> <td>The IP address the hub is running on</td> </tr> <tr> <td><code>tally.name</code></td> <td>How you want <em>this</em> tally to be labeled in the hub. This name needs to be unique amongst all tallies in your network. It must not be longer than <code>26</code> characters. Use of ASCII characters is recommended.</td> </tr> </tbody> </table> <p>For a list for all configuration values see <a href="../tally.html">tally-settings.ini Reference</a>.</p> </div> <p>Reboot the NodeMCU board by pressing the <code>RST</code> button on the board or disconnecting it from power briefly.</p> <div class="admonition success"> <p class="admonition-title">Success</p> <p>If the LED strip starts blinking blue, this means you have correctly connected the hardware, flashed the firmware and uploaded the code.</p> <p>After a few seconds it should show up in the Hub. Configure a channel there and the WiFi Tally should follow it.</p> <p><strong>Well done!</strong> </p> </div> <div class="admonition info"> <p class="admonition-title">Info</p> <p>If you run into problems, the <a href="../troubleshooting.html">Troubleshooting Guide</a> should have you covered.</p> </div> <h2 id="conclusion">Conclusion<a class="headerlink" href="#conclusion" title="Permanent link">&para;</a></h2> <p>This concludes the <a href="index.html">Getting Started Guide</a>.</p> <p>To learn of other options for the Tally Light, see the <a href="../tally.html">reference</a>.</p> </article> </div> </div> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer"> <a href="setup-web-tally.html" class="md-footer__link md-footer__link--prev" aria-label="Previous: Set up a Web Tally" rel="prev"> <div class="md-footer__button md-icon"> <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 11h12z"/></svg> </div> <div class="md-footer__title"> <div class="md-ellipsis"> <span class="md-footer__direction"> Previous </span> Set up a Web Tally </div> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> <div class="md-social"> <a href="https://github.com/wifi-tally" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg> </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": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "search": "../assets/javascripts/workers/search.22074ed6.min.js"}</script> <script src="../assets/javascripts/bundle.960e086b.min.js"></script> </body> </html>