<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Irvin Cossio Chavalier</title>
    <description>The latest articles on DEV Community by Irvin Cossio Chavalier (@irvin_chav).</description>
    <link>https://dev.to/irvin_chav</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1512677%2F7c773511-c212-4343-87a7-3669f51a737f.JPG</url>
      <title>DEV Community: Irvin Cossio Chavalier</title>
      <link>https://dev.to/irvin_chav</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/irvin_chav"/>
    <language>en</language>
    <item>
      <title>Web-Dex (BATT·SYS)</title>
      <dc:creator>Irvin Cossio Chavalier</dc:creator>
      <pubDate>Wed, 29 Apr 2026 05:29:06 +0000</pubDate>
      <link>https://dev.to/irvin_chav/web-dex-battsys-40c1</link>
      <guid>https://dev.to/irvin_chav/web-dex-battsys-40c1</guid>
      <description>&lt;h2&gt;
  
  
  Web-Dex (BATT·SYS)
&lt;/h2&gt;

&lt;p&gt;Bueno, ahora que tengo un poco de tiempo libre, quería hacer un par de ejemplos de las API.&lt;/p&gt;

&lt;p&gt;Con el primero que pensé era unos ejemplos de la batería mostrando imágenes de Pokémon, la línea evolutiva de Pikachu.&lt;/p&gt;

&lt;p&gt;Puedes verlo si tienes Chrome &lt;a href="https://irvin373.github.io/webDex/bateryAPI/index.html" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hook
&lt;/h2&gt;

&lt;p&gt;El navegador tiene información sobre el nivel de la batería.&lt;/p&gt;

&lt;p&gt;Las API web exponen el hardware real del dispositivo sin dependencias, sin tokens de autenticación ni solicitudes de red. La API de estado de la batería es uno de los ejemplos menos utilizados, pero también uno de los más útiles de inmediato.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. ¿Qué es la API web de estado de la batería?
&lt;/h2&gt;

&lt;p&gt;Esto es todo lo que se necesita:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;battery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBattery&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;navigator.getBattery()&lt;/code&gt; retorna un &lt;code&gt;Promise&lt;/code&gt; que al resolverse en un objeto &lt;code&gt;BatteryManager&lt;/code&gt;. que expone la siguiente información:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;level&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;float&lt;/code&gt; (0–1)&lt;/td&gt;
&lt;td&gt;El nivel de la bateria. &lt;code&gt;1.0&lt;/code&gt; = 100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charging&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Si el dispositivo está enchufado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chargingTime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;seconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tiempo hasta la carga completa (&lt;code&gt;Infinito&lt;/code&gt; si no se está cargando)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dischargingTime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;seconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tiempo hasta que se agote (&lt;code&gt;Infinito&lt;/code&gt; si se está cargando)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Y cuatro eventos que se activan cuando cambia cualquiera de esos valores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;levelchange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chargingchange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chargingtimechange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dischargingtimechange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin bibliotecas. Sin frameworks. El navegador envía las actualizaciones; tu función se ejecuta cuando algo cambia realmente.&lt;/p&gt;

&lt;p&gt;Esa es toda la interfaz de la API. Cuatro propiedades, cuatro eventos, una llamada asíncrona para empezar.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Browser Support Reality Check
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Chrome&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Edge&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opera&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Los navegadores basados en Chromium lo permiten. Firefox y Safari no, y hay un motivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firefox eliminó deliberadamente la API de estado de la batería&lt;/strong&gt;, alegando el riesgo de huella digital. El nivel de batería, combinado con el tiempo de carga/descarga, crea una firma de dispositivo sorprendentemente única. Investigadores demostraron que los sitios web podían rastrear a los usuarios entre sesiones e incluso entre diferentes navegadores en el mismo dispositivo, sin cookies, sin almacenamiento local, solo a partir de las lecturas de la batería.&lt;/p&gt;

&lt;p&gt;Es una verdadera disyuntiva: datos útiles del dispositivo frente a un vector de huella digital pasivo. Mozilla priorizó la privacidad. Chromium priorizó la funcionalidad.&lt;/p&gt;

&lt;p&gt;Si desarrollas con esta API, incluye una alternativa. Cuando &lt;code&gt;navigator.getBattery&lt;/code&gt; no esté definido, gestiona la degradación de forma segura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;getBattery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// show fallback UI — API not available&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El Github lo puedes encontrar aquí &lt;a href="https://github.com/irvin373/webDex/tree/main/bateryAPI" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y aquí una imagen de los estados:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rvnu7vhtplsc06qq4i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rvnu7vhtplsc06qq4i4.png" alt="web dex images displayed on web" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>api</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
