Este script inyecta una versión de firmware basada en git en el firmware ESP32 de PlatformIO

Este es un script de Python que puedes usar en tu proceso de compilación de PlatformIO para inyectar una cadena de versión de firmware basada en la etiqueta y el commit actuales de Git en el binario del firmware de tu ESP32. Esto es útil para rastrear qué versión del firmware se está ejecutando en tu dispositivo.

Un ejemplo de una versión que podría inyectar es v1.0.0-123-gabc1234@2025-08-27T02:06:15.

inject_git_version.py
#!/usr/bin/env python3
import subprocess
from datetime import datetime
import argparse
import sys


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--environment", help="The build environment to use")
    parser.add_argument("--chip", default="esp32", help="The chip to use (for esptool.py elf2image)")
    parser.add_argument("--flash_freq", default="40m", help="The flash frequency (for esptool.py elf2image)")
    parser.add_argument("--flash_mode", default="dio", help="The flash mode (for esptool.py elf2image)")
    args = parser.parse_args()

    # Determinar la versión de git y la fecha de compilación
    version = subprocess.check_output("git describe --long --tags --dirty", shell=True).strip().decode("utf-8")
    date = datetime.utcnow().isoformat()

    # Unir versión y fecha
    full_version_string = f"{version}@{date}".encode("utf-8")
    firmware_version_template = b"================================================================================"

    # Si no se especifica un entorno, solo imprimir la versión y salir
    if not args.environment:
        print(f"Version: {version}")
        print("No --environment specified, exiting...")
        sys.exit(1)

    with open(f".pio/build/{args.environment}/firmware.elf", "rb") as infile:
        firmware_binary = infile.read()
        # ¡Las cadenas de reemplazo deben tener exactamente la longitud correcta!
        version_replacement = full_version_string.ljust(len(firmware_version_template), b'\0')
        # ¡Reemplazar!
        firmware_binary = firmware_binary.replace(firmware_version_template, version_replacement, 1)

    # Escribir de vuelta al archivo
    with open(f".pio/build/{args.environment}/firmware-versioned.elf", "wb") as outfile:
        outfile.write(firmware_binary)

    # Escribir la versión en el archivo
    with open(f".pio/build/{args.environment}/version.txt", "w", encoding="utf-8") as outfile:
        outfile.write(version)

    # Convertir a ELF
    subprocess.check_output(f"esptool.py --chip {args.chip} elf2image --flash_freq {args.flash_freq} --flash_mode {args.flash_mode} .pio/build/{args.environment}/firmware-versioned.elf", shell=True)

Echa un vistazo a artículos similares por categoría: ESP32, Python