Seedlinker es una plataforma integral de Internet de las Cosas (IoT) diseñada para la gestión, monitoreo y automatización de entornos de cultivo e invernaderos. El sistema implementa una arquitectura distribuida que desacopla la lógica de control (backend), la interfaz de usuario (frontend y mobile) y la ejecución física, permitiendo una gestión remota eficiente y escalable de los dispositivos conectados (ESP32 y ESP8266).

Vista de dispositivo en Seedlinker Web
Vista de dispositivo en Seedlinker Web

Problema que resuelve

Los agricultores y administradores de invernaderos necesitan una forma accesible y visual de controlar sus cultivos, monitorear las condiciones ambientales y automatizar tareas como el riego, la ventilación y la iluminación. Seedlinker proporciona una solución centralizada que integra sensores, actuadores y dispositivos inteligentes para optimizar el rendimiento de los cultivos y reducir el esfuerzo manual, todo desde cualquier dispositivo.

Página principal de Seedlinker Mobile
Página principal de Seedlinker Mobile

Seedlinker Server

Seedlinker Server es el núcleo del sistema, encargado de gestionar, controlar y monitorizar dispositivos conectados a través de una arquitectura distribuida. El servidor se comunica con los dispositivos IoT utilizando el protocolo WebSocket, la comunicación se realiza de forma bidireccional donde recibe datos de los sensores (temperatura, humedad, agua) para almacenarlos y visualizarlos y envía comandos a los actuadores (bombas de agua, ventiladores, fuentes de luz) basándose en interacciones del usuario o automatizaciones predefinidas.

El servidor almacena la información en dos bases de datos distintas: una base de datos relacional (PostgreSQL) para gestionar la información de los usuarios y los registros obtenidos de los sensores, y una base de datos no relacional (MongoDB) para almacenar la configuración de los dispositivos y las automatizaciones. Esta separación permite optimizar el rendimiento y la escalabilidad del sistema, asegurando una gestión eficiente de los datos y una respuesta rápida a las interacciones del usuario.

Stack tecnológico

  • Backend
    • stack/python icon Python: Lenguaje de programación
    • stack/fastapi icon FastAPI: Framework web para construir APIs
    • 🦄 Uvicorn: Servidor ASGI para aplicaciones web
  • Base de datos
    • stack/postgres icon PostgreSQL: Base de datos relacional para almacenamiento de datos
    • stack/mongodb icon MongoDB: Base de datos NoSQL para almacenamiento de datos
    • stack/sqlmodel icon SQLModel: ORM para interactuar con bases de datos SQL
    • 🛵 Motor: Driver asíncrono para MongoDB en Python
  • Autenticación y seguridad
    • stack/authlib icon Authlib: Librería de autenticación para Python
    • stack/jwt icon PyJWT: JSON Web Tokens para autenticación segura
    • 🔑 bcrypt: Librería para el hash de contraseñas
  • Comunicación en tiempo real
    • 🌟 Starlette (WebSockets): Soporte para comunicación en tiempo real con WebSockets
  • Validación de datos
    • stack/pydantic icon Pydantic: Validación de datos y gestión de configuraciones
  • Documentación de la API
    • stack/swagger icon Swagger UI: Interfaz de usuario para documentación y pruebas de APIs

Funcionalidades

  • Gestión de dispositivos IoT: Permite a los usuarios registrar, configurar y controlar microcontroladores ESP32 y ESP8266, asignándoles nombres personalizados, funciones para cada pin, condiciones y estado operativo.

  • Sistema de automatización inteligente: Implementa un motor de automatización basado en condiciones programables que permite dos tipos de disparadores: condiciones por sensor y condiciones por tiempo. Las condiciones por sensor permiten activar actuadores cuando los valores de los sensores alcanzan umbrales específicos, mientras que las condiciones por tiempo permiten programar acciones en horarios determinados. El sistema soporta rangos de valores configurables y puede operar en modo automático o manual.

  • Comunicación bidireccional en tiempo real: A través de WebSockets, el servidor recibe datos de los microcontroladores con el estado en el que se encuentran y envía comandos para controlar los dispositivos, permitiendo una interacción fluida y en tiempo real entre el usuario y su entorno de cultivo.

  • Sistema de autenticación multicanal: Ofrece tres métodos de autenticación: registro/login tradicional con correo electrónico y contraseña, autenticación social a través de Google y a través de GitHub, proporcionando flexibilidad y seguridad para los usuarios.

  • JSON Web Tokens dual: Implementa un sistema de tokens JWT dual con access tokens de corta duración y refresh tokens para renovación segura de sesiones.

  • Historial y logging avanzado: Registra automáticamente todas las acciones realizadas en los dispositivos, incluyendo cambios de estado de actuadores y lecturas de sensores. Almacena datos de temperatura, humedad y niveles de agua con timestamps precisos.

  • Deep Linking para aplicaciones móviles: Implementa un sistema de deep linking que permite abrir la aplicación móvil directamente desde URLs web facilitando flujos OAuth y compartiendo datos entre el servidor web y la aplicación mediante esquemas de URL personalizados (seedlinkerapp://).

  • Identificación local de dispositivos: El servidor permite identificar localmente los microcontroladores a través de su UUID único, facilitando la vinculación de los dispositivos.

Página de inicio de sesión en Seedlinker Web en modo oscuro
Página de inicio de sesión en Seedlinker Web en modo oscuro

Módulos

Se describen de forma general los módulos principales del servidor:

  • routes: Controladores de la API. Se divide en endpoints HTTP (📄devices.py, 📄collection.py) y el manejo de conexiones persistentes (📄websocket_route.py).

  • crud: Lógica de negocio pura. Separa la interacción con la base de datos de la capa de red. Contiene 📄device_crud.py (Mongo), 📄log_crud.py (Postgres), 📄user_crud.py (Postgres) y 📄websocket_crud.py (lógica de mensajería).

  • models: Definiciones de estructuras de datos. Modelos Pydantic para validación de entrada / salida y modelos SQLModel para el ORM.

  • database: Gestión de conexiones asíncronas para ambos motores de base de datos.

  • dto: Data Transfer Objects para validación de entrada y salida de datos en la API.

  • data: Mapeo de códigos de dispositivos a nombres y tipos.

Dispositivos conectados mediante WebSockets en Seedlinker Client
Dispositivos conectados mediante WebSockets en Seedlinker Client

Modelo de datos

Base de datos PostgreSQL (relacional):

Modelo de datos de Seedlinker
Modelo de datos de Seedlinker

Puedes ver el modelo de datos en diagrams.net: Modelo de datos de Seedlinker

Base de datos MongoDB (no relacional):

{
	"uuid": "UUID",
	"user_uuid": "UUID",
	"name": "String | Null",
	"type": "ESP8266 | ESP32",
	"mode": "auto | manual",
	"status": "Boolean",
	"pins": [
		{
			"id": "String (8 chars)",
			"pin": "Integer (2-33)",
			"type": "input | output",
			"gpio": "String",
			"name": "temperature_and_humidity_sensor | water_sensor | heater | air_conditioner | water_pump",
			"value": "Integer (1-5)",
			"status": "Boolean"
		}
	],
	"conditions": {
		"by_sensor": [
			{
				"id": "String (8 chars)",
				"input_pin": "Integer",
				"input_mode": "Integer | Null",
				"value": "Integer",
				"output_pin": "Integer | Null",
				"min_value": "Integer (-999999999 to 999999999)",
				"max_value": "Integer (-999999999 to 999999999)"
			}
		],
		"by_time": [
			{
				"id": "String (8 chars)",
				"output_pin": "Integer",
				"start_hour": "Integer (0-23) | Null",
				"start_minute": "Integer (0-59) | Null",
				"end_hour": "Integer (0-23) | Null",
				"end_minute": "Integer (0-59) | Null"
			}
		]
	}
}

Prerequisitos

  • Python 3.10 o superior
  • Docker (opcional, para las base de datos PostgreSQL y MongoDB)

Instalación y ejecución (backend)

  1. Clona el repositorio:

    git clone https://github.com/igidio/seedlinker_server.git
       cd seedlinker_server
  2. Configuración de las bases de datos: Si tienes Docker instalado, puedes usar los siguientes comandos para iniciar las bases de datos PostgreSQL y MongoDB:

    docker compose up -d
  3. Configuración de las variables de entorno: Copia el archivo 📄.env.template a 📄.env y completa los valores necesarios para la configuración de la base de datos y otros parámetros.

    cp .env.template .env
    # Edita el archivo .env con tus valores
  4. Instala las dependencias de Python:

    pip install -r requirements.txt
  5. Inicia el servidor:

    python run.py

Si todo está configurado correctamente, el servidor debería estar corriendo en 🔗http://localhost:8000 y listo para recibir conexiones de los dispositivos IoT y las aplicaciones cliente.

Seedlinker Web Client

Seedlinker Web Client es una aplicación web progresiva que sirve como interfaz de ususario para el ecosistema Seedlinker de gestión de invernaderos IoT. Proporciona a los usuarios una plataforma intuitiva y responsiva para monitorear y controlar los dispositivos conectados, visualizar datos en tiempo real, configurar automatizaciones y gestionar los microcontroladores ESP32 y ESP8266 desde cualquier navegador.

Página principal de Seedlinker Web
Página principal de Seedlinker Web

Stack tecnológico

  • Frontend
    • stack/typescript icon TypeScript: Lenguaje principal del proyecto
    • stack/vue icon Vue 3: Framework de interfaz de usuario
    • stack/vite icon Vite: Herramienta de construcción rápida
    • stack/pinia icon Pinia: Gestión de estado para el manejo global de datos
  • UI
    • stack/tailwind icon Tailwind 3: Framework de estilos
    • stack/daisyui icon daisyUI: Componentes preconstruidos y reutilizables para Tailwind CSS
  • Obtención de datos
    • stack/axios icon Axios: Cliente HTTP para realizar solicitudes a APIs
  • Internacionalización
    • stack/vue icon Vue I18n: Soporte multilenguaje
  • Utilidades
    • 🕰️ Luxon: Manejo de fechas y horas
    • stack/chartjs icon Chart.js: Librería de visualización de datos para gráficos
  • Herramientas de desarrollo
    • stack/eslint icon ESLint: Herramienta de linting para mantener la calidad del código
    • stack/prettier icon Prettier: Formateador de código para mantener un estilo consistente

Funcionalidades

  • Dashboard de control: Ofrece una vista centralizada de todos los dispositivos registrados, mostrando su estado actual, lecturas de sensores y permitiendo el control manual de actuadores.
  • Visualización de datos en tiempo real: Muestra gráficos interactivos con las lecturas de los sensores (temperatura, humedad, niveles de agua) actualizados en tiempo real para facilitar el monitoreo del entorno de cultivo.
  • Visualización de logs y gráficas: Pantalla dedicada (LogsView) para consultar el historial de eventos y lecturas de sensores, también proporciona de forma visual la información de los sensores.
  • Modo claro y oscuro: Permite a los usuarios elegir entre un tema claro y oscuro para la interfaz, mejorando la experiencia de usuario en diferentes condiciones de iluminación.
  • Internacionalización: Soporta idiomas como inglés y español, con la capacidad de agregar más idiomas en el futuro.
Vista de logs en modo oscuro
Vista de logs en modo oscuro

Módulos

  • components: Componentes de UI divididos en partes del proyecto y componentes reutilizables.
  • views: Vistas a nivel de página, como el dashboard principal y la vista de logs.
  • layouts: Componentes que envuelven las vistas para proporcionar una estructura común, como el layout principal.
  • router: Configuración de rutas para la navegación entre páginas.
  • stores: Gestión de estado global utilizando Pinia, como la lista de dispositivos conectados.
  • composables: Funciones reutilizables para lógica común, que encapsulan lógica y llamadas API.
  • interfaces: Tipos de Typescript para definir la estructura de datos utilizada en la aplicación.
  • schemas: Esquemas de validación de datos utilizando Zod para validar la entrada y salida de datos en la aplicación.
  • translations: Cadenas de texto para internacionalización, organizadas por idioma.
  • assets: Recursos estáticos y estilos.
  • utils: Helpers utilitarios, como cookies, validación de UUID, etc.
  • classes: Clases reutilizables para lógica y servicios.
  • data: Datos estáticos y configuraciones.

Prerrequisitos

  • Node.js 18.x o superior
  • npm 9.x o superior
  • Seedlinker Server corriendo y accesible para la comunicación con el cliente web.

Instalación y ejecución (frontend)

  1. Clona el repositorio:

    git clone https://github.com/igidio/seedlinker_web_client.git
    cd seedlinker_web_client
  2. Instala las dependencias:

    npm install
  3. Configuración de variables de entorno: Copia el archivo 📄.env.template a 📄.env y determina la dirección del servidor Seedlinker (si está desplegado en un puerto distinto a 8000).

    cp .env.template .env
    # Edita el archivo .env con tus valores
  4. Inicia la aplicación en modo desarrollo:

    npm run dev

La aplicación debería estar corriendo en 🔗http://localhost:3000 y lista para interactuar con el servidor Seedlinker.

Seedlinker ESP32 / ESP8266

Seedlinker ESP32 y Seedlinker ESP8266 son los firmware personalizados desarrollados para los microcontroladores ESP32 y ESP8266 que forman parte del ecosistema Seedlinker. Estos firmware permiten que los dispositivos lean sensores (temperatura, humedad, agua), controlen actuadores (calefactores, ventiladores, bombas de agua), y se comuniquen en tiempo real con el servidor Seedlinker a través de WebSockets.

Los firmwares están desarrollados en C++ usando el framework Arduino sobre PlatformIO, lo que proporciona un entorno de desarrollo moderno con gestión de dependencias, debugging avanzado y compilación optimizada. También están programados para mantener estado global para variables críticas como el estado de los sensores, actuadores y la conexión WiFi, permitiendo una operación eficiente y confiable en entornos de cultivo.

Vista de dispositivo en Seedlinker Mobile
Vista de dispositivo en Seedlinker Mobile

Stack tecnológico

  • Hardware objetivo
    • stack/espressif icon ESP32: Microcontrolador para proyectos de IoT
    • stack/espressif icon ESP8266: Microcontrolador para proyectos de IoT
  • Firmware
    • stack/cpp icon C++: Lenguaje de programación para desarrollo de firmware
    • stack/platformio icon PlatformIO: Entorno de desarrollo para proyectos de IoT
    • stack/arduino icon Arduino Framework: Framework para desarrollo de firmware en microcontroladores
  • Comunicación
    • 🔌 WebSockets: Protocolo de comunicación en tiempo real
    • 🌐 HTTP: Protocolo de comunicación para la web
  • Librerías
    • 🌡️ DHT Sensor library: Librería para sensores DHT (temperatura y humedad)
    • NTPClient: Librería para sincronización de tiempo con servidores NTP
    • stack/arduino icon ArduinoJson: Librería para manejo de JSON en Arduino

Funcionalidades

  • Identidad única: El dispositivo genera y guarda un UUID en su memoria permanente. Así, cada dispositivo puede ser identificado de forma única en el ecosistema Seedlinker, permitiendo una gestión eficiente y personalizada de cada microcontrolador.

  • Modo híbrido: El firmware soporta dos modos de operación: automático y manual. En el modo automático, el dispositivo evalúa las condiciones programadas (por sensor y por tiempo) para controlar los actuadores de forma autónoma. En el modo manual, el usuario puede controlar directamente los actuadores a través de comandos enviados desde el servidor Seedlinker.

  • Automatización local: El firmware puede ejecutar reglas de automatización directamente en el dispositivo, sin necesidad de intervención del servidor, lo que garantiza una respuesta rápida y confiable ante cambios en el entorno.

  • Envío de logs al servidor: El dispositivo envía logs detallados al servidor Seedlinker cada vez que se produce un cambio de estado en los sensores o actuadores.

  • Gestión automática de pines: El firmware dispone de un sistema de vectores (std::vector) para rastrear qué pines deben estar encendidos y apaga automáticamente los que ya no se necesitan, evitando conflictos.

Modal para agregar pin en Seedlinker Web
Modal para agregar pin en Seedlinker Web

Módulos

  • main.cpp: Punto de entrada del firmware, encargado de inicializar el hardware, establecer la conexión WiFi y WebSocket, y gestionar el ciclo principal de lectura de sensores y control de actuadores.

  • auto: Motor de automatización que evalúa las condiciones programadas por el usuario (por sensor y por tiempo) y ejecuta las acciones correspondientes en los actuadores.

  • websocket: Módulo encargado de gestionar la comunicación WebSocket con el servidor Seedlinker, enviando datos de sensores y recibiendo comandos para controlar los actuadores.

  • messages: Define el protocolo de comunicación, donde se estructuran los mensajes JSON enviados y recibidos a través de WebSockets.

  • wifi_utils: Funciones auxiliares para la gestión de la conexión WiFi, incluyendo reconexión automática y manejo de eventos de conexión.

  • get_uuid: Funciones para obtener el UUID único del dispositivo, utilizado para identificarlo en el ecosistema Seedlinker.

  • utils: Utilidades adicionales para el firmware.

Prerrequisitos

  • ESP32 o ESP8266
  • Drivers de microcontroladores instalados en el sistema
  • PlatformIO IDE (extensión de Visual Studio Code) o PlatformIO Core CLI
  • Cable USB para programar el dispositivo
  • Credenciales de WiFi para conectar el dispositivo a la red local
  • Servidor Seedlinker corriendo y accesible para la comunicación con el dispositivo

Instalación y ejecución (firmware)

  1. Clona el repositorio del firmware correspondiente a tu dispositivo:

    # Para ESP32
    git clone https://github.com/igidio/seedlinker_esp32.git
    cd seedlinker_esp32
    # Para ESP8266
    git clone https://github.com/igidio/seedlinker_esp8266.git
    cd seedlinker_esp8266
  2. Configura la conexión WiFi y la dirección del servidor Seedlinker editando el archivo 📄src/main.cpp:

    const char *ssid = "Your_SSID";           // Your WiFi network name
    const char *password = "YOUR_PASSWORD";   // Your WiFi password
    const char *server = "192.168.0.99";      // SeedLinker Server IP
    const int port = 8000;                     // SeedLinker Server port
    // . . .
  3. Conecta tu dispositivo al ordenador mediante el cable USB.

  4. Compila y sube el firmware al dispositivo usando PlatformIO:

    pio run --target upload

Una vez que el firmware esté cargado en el dispositivo, este se reiniciará automáticamente. En el primer arranque, el dispositivo generará un UUID único y se conectará a la red WiFi configurada. Luego, intentará establecer una conexión WebSocket con el servidor Seedlinker utilizando la dirección IP y el puerto especificados.

Seedlinker Android App

Seedlinker Android App es una aplicación móvil para Android desarrollada con Flutter que proporciona una interfaz nativa para el ecosistema Seedlinker. La aplicación permite a los usuarios monitorear y controlar sus dispositivos IoT desde cualquier lugar, con una experiencia optimizada para dispositivos móviles que incluye comunicación en tiempo real y deep linking para una integración fluida con el servidor Seedlinker.

Pantalla de inicio de sesión de Seedlinker Android App
Pantalla de inicio de sesión de Seedlinker Android App

Stack tecnológico

  • Mobile
    • stack/dart icon Dart: Lenguaje de programación
    • stack/flutter icon Flutter: Framework para desarrollo de aplicaciones móviles
  • Gestión de estado
    • stack/riverpod icon Riverpod: Gestión de estado para Flutter
  • Navegación
    • stack/flutter icon Go Router: Gestión de rutas
  • Obtención de datos
    • stack/flutter icon Dio: Cliente HTTP para Dart y Flutter
    • stack/dart icon Web Socket Channel: Soporte para comunicación en tiempo real con WebSockets
  • UI
    • stack/google_fonts icon Google Fonts: Integración de fuentes personalizadas
    • stack/flutter icon Flutter SVG: Soporte para gráficos SVG
    • stack/iconify icon Iconify: Iconos
    • 🎬 animate_do: Librería de animaciones
  • Internacionalización
    • 🌍 Easy Localization: Soporte multilenguaje
  • Persistencia local
    • stack/flutter icon Shared Preferences: Almacenamiento de datos local
  • Link management
    • 🔗 app_links: Soporte para deep linking
    • stack/flutter icon URL Launcher: Lanzamiento de URLs externas
  • Utilidades
    • 🌿 flutter_dotenv: Carga de variables de entorno
    • stack/flutter icon device_info_plus: Carga de variables de entorno
    • 🍞 fluttertoast: Muestra de mensajes emergentes (toasts)
    • stack/flutter icon Flutter Launcher Icons: Generación de íconos de aplicación

Funcionalidades

  • Autenticación de usuarios: Autenticación con tres métodos: tradicional (correo electrónico y contraseña), autenticación social a través de Google y autenticación a través de GitHub, proporcionando flexibilidad y seguridad para los usuarios.

  • Control de dispositivos en detalle: Vista completa de cada dispositivo registrado, mostrando su estado actual, lecturas de sensores y permitiendo el control manual de actuadores.

  • Gestión de pines (GPIO): Permite configurar y controlar los pines de los dispositivos, asignándoles funciones específicas y monitoreando su estado en tiempo real.

  • Perfil de usuario y configuración: Permite a los usuarios gestionar su perfil, cambiar su contraseña, configurar preferencias de la aplicación y gestionar sus dispositivos registrados.

  • Deep linking: Autenticación a través de deep linking, permitiendo a los usuarios iniciar sesión en la aplicación móvil directamente desde URLs web, facilitando flujos OAuth y compartiendo datos entre el servidor web y la aplicación mediante esquemas de URL personalizados (seedlinkerapp://).

  • WebSockets en tiempo real: Conexión WebSocket persistente que se establece al iniciar la aplicación y se mantiene durante toda la sesión, escucha eventos de servidor como la conexión y desconexión de otros dispositivos y permite la reconexión automática en caso de pérdida de conexión, asegurando una experiencia fluida y en tiempo real para el usuario.

  • Internacionalización: Soporta idiomas como inglés y español, con la capacidad de agregar más idiomas en el futuro.

  • Tema claro y oscuro: Permite a los usuarios elegir entre un tema claro y oscuro para la interfaz, mejorando la experiencia de usuario en diferentes condiciones de iluminación.

Pantalla para vincular cuenta
Pantalla para vincular cuenta
Pantalla para conectar dispositivos
Pantalla para conectar dispositivos

Módulos

  • main.dart: Punto de entrada de la aplicación, encargado de inicializar la aplicación, configurar rutas y gestionar el estado global.

  • routes.dart: Define las rutas de navegación de la aplicación, incluyendo pantallas de autenticación, dashboard, detalles de dispositivos y perfil de usuario.

  • models: Define las estructuras de datos utilizadas en la aplicación, incluyendo modelos para usuarios, dispositivos, sensores y actuadores.

  • providers: Gestionan el estado global de la aplicación utilizando Riverpod, como la lista de dispositivos conectados.

  • services: Contiene la lógica de comunicación con el servidor Seedlinker.

  • storages: Gestiona la persistencia local de datos, como tokens de autenticación y configuraciones de usuario.

  • theme: Define los colores y estilos de la aplicación.

  • layouts: Define la estructura general de las pantallas, como el dashboard y los detalles de dispositivos.

  • widgets: Componentes reutilizables para la interfaz de usuario, como las tarjetas de dispositivos o los distintos botones.

  • utils: Funciones y utilidades generales que se utilizan en toda la aplicación, como formateo de fechas.

  • features: Contiene la lógica específica para cada pantalla.

Prerrequisitos

  • Flutter SDK 3.7.x o superior
  • Android Studio o Visual Studio Code con la extensión Flutter instalada
  • Un dispositivo Android o un emulador configurado para pruebas
  • Seedlinker Server corriendo y accesible para la comunicación con el cliente web.

Instalación y ejecución (mobile)

  1. Clona el repositorio:

    git clone https://github.com/igidio/seedlinker_androidapp.git
    cd seedlinker_androidapp
  2. Instala las dependencias:

    flutter pub get
  3. Configura las variables de entorno: Copia el archivo 📄.env.template a 📄.env y determina la dirección del servidor Seedlinker (si está desplegado en un puerto distinto a 8000).

    cp .env.template .env
    # Edita el archivo .env con tus valores
  4. Inicia la aplicación en modo desarrollo:

    flutter run

Licencia

Este proyecto está bajo la Licencia MIT. Consulta el archivo 📄LICENSE.md de los proyectos para más detalles.

© 2026 igidio