Instalación de NILMTK y nilmtk-contrib en Windows 11: retos y solución definitiva con WSL y pyenv


En este blog hemos hablado en muchísimas ocasiones del paquete NILMTK, el famoso paquete open software para implementar la desagregacion de la energia .NILMTK es un toolkit de código abierto para Non-Intrusive Load Monitoring (NILM), cuya utilidad principal es desagregar el consumo eléctrico de una vivienda en los diferentes electrodomésticos usando solo la lectura de un medidor general. ¿Qué significa esto?

  • NILM (Non-Intrusive Load Monitoring): Técnica que estima cuánta energía consume cada aparato sin necesidad de instalar sensores individuales en cada uno.
  • NILMTK (Toolkit): Es una biblioteca en Python que ofrece algoritmos, datasets y herramientas para investigar, probar y comparar métodos de desagregación energética.

Utilidad práctica

  • Investigación en Smart Grids: Permite estudiar hábitos de consumo eléctrico sin desplegar muchos medidores.
  • Eficiencia energética: Ayuda a identificar qué aparatos consumen más y cuándo, facilitando estrategias de ahorro.
  • Aplicaciones comerciales: Puede generar facturas detalladas a partir de un único medidor, útil para compañías eléctricas o proyectos de domótica.
  • Desarrollo académico: Es usado en universidades y centros de investigación para probar nuevos algoritmos de machine learning aplicados al consumo energético.

NILMTK convierte una sola lectura de energía en información detallada por aparato, lo que lo hace valioso para investigación, eficiencia y gestión energética. Todo esto esta muy bien ….pero instalar NILMTK y nilmtk-contrib en Windows 11 puede convertirse en una tarea complicada debido a incompatibilidades de versiones de Python y dependencias antiguas usadas por las librerías. Si bien la opción inicial recomendada suele ser crear un entorno conda con Python 3.7, con frecuencia surgen problemas al manejar las versiones correctas de dependencias como numpy y pandas , por eso otro camino puede ser usar WSL ,el cual vamos a explorar en este post, pero antes veamos los problemas a los qeu nos enfrentamos con la instalación clásica con la herramienta Conda/miniconda.

Problemas frecuentes al usar Conda en Windows

Debido a que NILMTK requiere versiones específicas, comúnmente se intenta crear un entorno conda con Python 3.7:

conda create -n nilmtk-env python=3.7
conda activate nilmtk-env
conda install -c nilmtk nilmtk=0.4.3 numpy=1.19.5 -y

No obstante, se presentan errores como LibMambaUnsatisfiableError porque la dependencia hmmlearn no está disponible en el canal nilmtk. Agregar el canal conda-forge y combinar instalaciones con conda y pip es la solución habitual:

conda config --add channels conda-forge
conda config --set channel_priority flexible
conda install hmmlearn numpy=1.19.5 -y
pip install nilmtk==0.4.3 --no-deps

Sin embargo, incluso con estos ajustes, la instalación en Windows puede ser inestable. Además, NILMTK no está oficialmente publicado en PyPI, por lo que la instalación desde código fuente usando pip es habitual, lo que puede generar otras complicaciones relacionadas con versiones de Python y dependencias de construcción como hatchling.

La solución definitiva: usar WSL con pyenv y Python 3.11.5

La forma más estable es instalar NILMTK dentro de WSL (Windows Subsystem for Linux), usando pyenv para gestionar una versión compatible de Python, concretamente la 3.11.5. Esto permite:

  • Evitar conflictos de versiones de dependencias antiguas.
  • Usar la infraestructura Linux más compatible para herramientas científicas.
  • Integrar sin problemas con Visual Studio Code y Jupyter.

Pasos clave para esta instalación en WSL

  1. Prepara WSL con las dependencias básicas para compilar Python
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
libsqlite3-dev wget curl llvm libncurses-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git
  1. Instala pyenv y configúralo en tu shell
curl https://pyenv.run | bash

Incluye al final de ~/.bashrc:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Carga la configuración actual:

source ~/.bashrc
  1. Instala Python 3.11.5 y crea un entorno virtual específico para NILMTK
pyenv install 3.11.5
pyenv virtualenv 3.11.5 nilmtk-env
pyenv activate nilmtk-env
  1. Actualiza pip y instala las dependencias fundamentales
pip install --upgrade pip setuptools wheel
pip install numpy pandas hmmlearn h5py matplotlib networkx nose tables tqdm
pip install git+https://github.com/nilmtk/nilm_metadata.git
  1. Clona el código fuente de NILMTK y nilmtk-contrib e instálalos
git clone https://github.com/nilmtk/nilmtk.git
git clone https://github.com/nilmtk/nilmtk-contrib.git

cd nilmtk
pip install -e . --no-deps
cd ..

cd nilmtk-contrib
pip install -r requirements.txt --no-deps
pip install -e . --no-deps
cd ..
  1. Configura Jupyter para usar el nuevo entorno
pip install jupyter ipykernel
python -m ipykernel install --user --name=nilmtk-env --display-name "Python (nilmtk-env)"
  1. Integra con Visual Studio Code

Abre VS Code desde la terminal WSL con el entorno activado:

pyenv activate nilmtk-env
code .

Selecciona el intérprete Python ubicado en:

text/home/carlo/.pyenv/versions/3.11.5/envs/nilmtk-env/bin/python

Y en los notebooks selecciona el kernel "Python (nilmtk-env)".

Conclusión

Aunque instalar NILMTK y nilmtk-contrib en Windows 11 presenta numerosos retos por incompatibilidades de versiones y dependencias, usar WSL combinado con pyenv y Python 3.11.5 proporciona un entorno estable, funcional y que integra bien con VS Code y Jupyter.

Este es el método recomendado para investigadores y desarrolladores que buscan máxima compatibilidad y facilidad para trabajar con NILMTK en Windows.

Cómo crear tu propia app de reloj con temperatura para Android (sin anuncios)


A medida que pasa el tiempo vamos acumulando irremediablemente dispositivos totalmente o parcialmente funcionales como tabletas o smartphone que dejan de ser útiles por obsolescencia o simplemente porque hemos adquirido un dispositivo mas potente que supera en prestaciones a lo que ya teníamos. En esta encrucijada, sobre todo por el poco valor que puede tener un dispositivo antiguo, lo ideal es darle una segunda vida con otro uso como por ejemplo como cámara de seguridad, como panel de domòtica, etc. o mi favorita: !como reloj gigante!.

En efecto ¿estas cansado de las apps de reloj y temperatura llenas de publicidad o con versiones de pago? . La solución más simple es hacer tu propia app minimalista, gratuita y sin depender de servicios comerciales.
Y lo mejor: puedes hacerlo tú mismo, sin ser experto en Android.

Opción 1 — Kivy (Python): simple y rápida

Si ya trabajas con Python, esta es la forma más sencilla.
Kivy te permite crear interfaces gráficas multiplataforma y exportar tu app a Android con facilidad.

Qué necesitas

  • Un teléfono Android con Termux, o un PC con Linux/Windows.
  • Instalar las dependencias básicas:
bashpip install kivy buildozer

Con eso podrás compilar tu app a APK usando buildozer, directamente desde tu propio sistema.

Ejemplo mínimo: reloj + temperatura + pantalla encendida

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.core.window import Window
import requests, datetime

Window.clearcolor = (0, 0, 0, 1)
Window.borderless = True
Window.show_cursor = False

class ClockApp(App):
def build(self):
self.label = Label(font_size='60sp', halign='center', valign='middle')
Clock.schedule_interval(self.update, 60)
self.update(0)
return self.label

def update(self, dt):
now = datetime.datetime.now().strftime("%H:%M")
temp = self.get_temperature()
self.label.text = f"{now}\n{temp}°C"

def get_temperature(self):
try:
url = "https://api.open-meteo.com/v1/forecast?latitude=40.4&longitude=-3.7&current_weather=true"
data = requests.get(url, timeout=5).json()
return int(data['current_weather']['temperature'])
except:
return "--"

if __name__ == '__main__':
ClockApp().run()

Solo cambia las coordenadas latitude y longitude por tu ubicación.
Kivy mantiene la pantalla encendida automáticamente mientras la app esté activa.

Para generar el paquete instalable, compila con:

buildozer android debug

Obtendrás un APK listo para instalar.

Opción 2 — Android Studio (si prefieres Kotlin/Java)

También puedes hacerlo con Android Studio, en Kotlin, de forma muy sencilla:

class MainActivity : AppCompatActivity() {
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
textView = TextView(this)
textView.textSize = 64f
textView.gravity = Gravity.CENTER
setContentView(textView)
update()
Timer().scheduleAtFixedRate(object : TimerTask() {
override fun run() { runOnUiThread { update() } }
}, 0, 60000)
}

private fun update() {
val time = SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date())
val temp = "--°C" // Aquí puedes añadir la API de Open-Meteo
textView.text = "$time\n$temp"
}
}

Con un par de líneas más puedes integrar la API gratuita de Open-Meteo para obtener la temperatura actual.

Resultado

Pantalla negra, texto blanco grande con hora + temperatura, sin apagado automático (KEEP_SCREEN_ON).
Sin publicidad, sin permisos extraños, sin coste.

Ideas para mejorar

  • Controlar el brillo máximo o modo nocturno.
  • Permitir configurar manualmente la ubicación.
  • Añadir fecha o iconos del clima.
  • Mostrar estado de batería o conexión Wi-Fi.

Conclusión:
Crear tu propia app de reloj con temperatura en Android no solo es posible, sino también una excelente forma de aprender desarrollo móvil sin depender de terceros.
Usar Kivy o Kotlin te permite mantener el control total: diseño limpio, sin anuncios y con funcionalidad útil para tu día a día.