Crear sensor bateria Android e integrarlo en Home Assistant

Después de regalarle a mi hijo un flamante IPhone 14 me vino con la tonteria de que no se podia cargar a mas del 90% , alucinante , te compras un mega chachi pirulo o seaaaaaaaaaa movil que no se puede cargar al 100%, lo peor de todo es que por tener esa castaña de móvil lo asumen , pero esto ya es divagar , volviendo al tema del sensor me puse en un rato y dije , voy a crear un sistema para cargarlo hasta el 90% y parar , pero para trastear donde este un buen Android que se quite el IPhone.

Lo primero es crear una base de datos en MySQL , accederemos mediante phpMyAdmin

Creamos la tabla bateria , yo le añadí estos cuatro campos

Lo siguiente crearemos una pagina en PHP para recoger los datos que le enviemos , la llamaremos get-data.php

Esta pagina recoge los datos que le pasemos por GET en la URL de llamada y los inserta en la tabla

<?php

// Establecer la zona horaria de Madrid
date_default_timezone_set('Europe/Madrid'); 

$servername = "localhost";
$dbname = "bateria";
$username = "xxxxxxxxx";
$password = "yyyyyyyyyyyyyyyy";

$api_key_value = "zzzzzzzzzz";

// Recibir los parámetros enviados
$api_key = test_input($_GET['api_key']) ?? '';
$movil = test_input($_GET['movil']) ?? '';
$porcentaje = test_input($_GET['porcentaje']) ?? '';
$estado = test_input($_GET['estado']) ?? '';

if($api_key == $api_key_value) {
	$fecha = date("Y-m-d H:i:s");
    		
    // Crear conexión
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Probar conexión
    if ($conn->connect_error) {
        die("Fallo conexión : " . $conn->connect_error);
    } 
    
    $sql = "INSERT INTO bateria (movil, porcentaje, fecha , estado)
    VALUES ('" . $movil . "', '" . $porcentaje . "', '" . $fecha . "', '" . $estado . "')";
    
	
    if ($conn->query($sql) === TRUE) {
        echo "Registro añadido";
    } 
    else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

    $conn->close();
}
else {
    echo "Error en la API Key.";
}


function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

Haremos la prueba con cualquier herramienta online al uso que encontremos para ello , yo use para ello https://reqbin.com/

La url de llamada quedaria algo similar a esto http://antrivas.duckdns.org:XXXX/YYYYYY/get-data.php?api_key=xxxxxxxx&movil=antonio&porcentaje=91&estado=connect

Si todo es correcto nos devolverá este mensaje en la pagina web

En phpMyAdmin veremos como en cada llamada va insertando registros en la tabla

Ahora crearemos en macrodroid un par de macros , la primera para que nos ponga en una variable global el estado de la carga.

Primero creamos la variable global

Hacemos que cualquier cambio o cada minuto se active la actualización de estado de la carga

Ahora crearemos la segunda automatización que se encargue de enviar los datos cada intervalo de tiempo a la siguiente URL

http://antrivas.duckdns.org:XXXX/YYYYYY/get-data.php?api_key=ZZZZZZZ&movil=antonio&porcentaje={lv=nivel_batería}&estado={v=estado_carga}

La creamos y le damos como ciclo de repetición cada cinco minutos.

Lo primero será fijar el nivel de bateria actual

Enviamos los datos por HTTP GET

Guardamos la respuesta para un messagebox ( mientras depuramos las automatizaciones ) y guardarlo en un fichero de log

Podremos ver en el log de Macrodroid como se van produciendo las acciones

Y en la base de datos ya nos iran apareciendo los registros tras cada una de las llamadas a la URL

Ahora toca liarnos con la parte de Home Assistant

En secrets.yaml pondremos nuestra cadena de conexión a la base de datos baterias

db_url_bateria: mysql://xxxxxxxxxx:yyyyyyyyy@127.0.0.1:9306/bateria?charset=utf8

En la sección sensors añadiremos cuatro sensores , dos de porcentaje , y dos de estado

  - platform: sql
    db_url: !secret db_url_bateria
    scan_interval: 60
    queries:
      - name: 'bateria_movil_antonio_porcentaje'
        query: "SELECT * FROM `bateria` WHERE movil = 'antonio' ORDER BY fecha DESC LIMIT 1;"
        column: 'porcentaje'
        unit_of_measurement: "%"
 
  - platform: sql
    db_url: !secret db_url_bateria
    scan_interval: 60
    queries:
      - name: 'bateria_movil_oriol_porcentaje'
        query: "SELECT * FROM `bateria` WHERE movil = 'oriol' ORDER BY fecha DESC LIMIT 1;"
        column: 'porcentaje'
        unit_of_measurement: "%"

  - platform: sql
    db_url: !secret db_url_bateria
    scan_interval: 60
    queries:
      - name: 'bateria_movil_antonio_cargando'
        query: "SELECT * FROM `bateria` WHERE movil = 'antonio' ORDER BY fecha DESC LIMIT 1;"
        column: 'estado'
 
  - platform: sql
    db_url: !secret db_url_bateria
    scan_interval: 60
    queries:
      - name: 'bateria_movil_oriol_cargando'
        query: "SELECT * FROM `bateria` WHERE movil = 'oriol' ORDER BY fecha DESC LIMIT 1;"
        column: 'estado'

En configuration.yaml haremos que nos guarde los valores añadiéndolos en la sección recorder.

      - sensor.bateria_movil_antonio_porcentaje
      - sensor.bateria_movil_oriol_porcentaje      
      - sensor.bateria_movil_antonio_cargando
      - sensor.bateria_movil_oriol_cargando

Lo pondremos a nuestro gust en el fichero customize.yaml

sensor.bateria_movil_antonio_porcentaje:
  friendly_name: Bateria movil Antonio
  icon: mdi:battery-90

sensor.bateria_movil_oriol_porcentaje:
  friendly_name: Bateria movil Oriol
  icon: mdi:battery-90

sensor.bateria_movil_antonio_cargando:
  friendly_name: Estado carga movil Antonio
  icon: mdi:battery-charging-90

sensor.bateria_movil_oriol_cargando:  
  friendly_name: Estado carga movil Oriol
  icon: mdi:battery-charging-90

Y ya lo podemos poner en nuestro panel lovelace

      - type: entities
        title: Baterias moviles
        show_name: true
        show_state: false
        show_header_toggle: false
        columns: 3     
        entities:     
          - sensor.bateria_movil_antonio_porcentaje
          - sensor.bateria_movil_antonio_cargando
          - type: divider            
          - sensor.bateria_movil_oriol_porcentaje      
          - sensor.bateria_movil_oriol_cargando

Ya nos aparece en el panel

Y podemos ver la grafica de la bateria

Y los diferentes estados de carga del dispositivo

Y ahora pasaremos a crear las automatizaciones para controlar el máximo de carga de bateria al 90% y volver a cargar cuando baje a 80% , también desconectaremos el cargador cuando no estemos en casa.

####################################
##### Enchufe cargador Antonio #####
####################################  


- alias: Enchufe cargador antonio carga inferior a 80
  id: Enchufe cargador antonio carga inferior a 80
  initial_state: 'on'
  trigger:
    - platform: numeric_state
      entity_id: 
        - sensor.bateria_movil_antonio_porcentaje       
      below: 80
  condition:
    - condition: state
      entity_id: input_boolean.int_presencia_antonio
      state: 'on'     
  action:
    #Enchufe cargador Antonio
    - service: switch.turn_on
      entity_id: switch.enchufe_27_cargador_movil_antonio
  


- alias: Enchufe cargador antonio carga superior a 90
  id: Enchufe cargador antonio carga superior a 90
  initial_state: 'on'
  trigger:
    - platform: numeric_state
      entity_id: 
        - sensor.bateria_movil_antonio_porcentaje       
      above: 90
  condition:
    - condition: state
      entity_id: input_boolean.int_presencia_antonio
      state: 'on'     
  action:
    #Enchufe cargador Antonio
    - service: switch.turn_off
      entity_id: switch.enchufe_27_cargador_movil_antonio


- alias: Enchufe cargador antonio apagar si no se esta en casa
  id: Enchufe cargador antonio apagar si no se esta en casa
  initial_state: 'on'
  trigger:
    - platform: numeric_state
      entity_id: 
        - sensor.bateria_movil_antonio_porcentaje       
  condition:
    - condition: state
      entity_id: input_boolean.int_presencia_antonio
      state: 'off'     
  action:
    #Enchufe cargador Antonio
    - service: switch.turn_off
      entity_id: switch.enchufe_27_cargador_movil_antonio

Y con esto y un bizcocho ….