Download the PHP package homlity/sdk-smarthome without Composer

On this page you can find all versions of the php package homlity/sdk-smarthome. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package sdk-smarthome

Homlity para desarrolladores

Homlity SDK · Smart Inmobiliario

SDK oficial de PHP para integrar el inventario inmobiliario y el CRM de Homlity en cualquier sitio o aplicación.

Packagist Descargas PHP GitHub

Sitio principal · Portal de desarrolladores · Packagist · GitHub


Tabla de contenido

  1. ¿Qué es este SDK?
  2. ¿Para qué sirve?
  3. Requisitos
  4. Instalación
  5. Credenciales
  6. Inicio rápido
  7. Referencia de la API del SDK
  8. Modelos de datos
  9. Catálogos y códigos
  10. Ejemplos completos
  11. Integración con frameworks
  12. Buenas prácticas
  13. Limitaciones y advertencias
  14. Endpoints REST subyacentes
  15. Solución de problemas
  16. Pruebas
  17. Versionado y changelog
  18. Soporte

¿Qué es este SDK?

homlity/sdk-smarthome es una librería PHP sin frameworks que envuelve la API REST del integrador inmobiliario de Homlity (https://api.smart-home.com.co). En lugar de armar URLs, manejar cURL y navegar arrays asociativos en inglés, trabajas con objetos PHP con métodos en español:

El SDK resuelve tres cosas por ti:

Sin el SDK Con el SDK
Construir URLs con companyCode / projectCode en cada llamada Configuras las credenciales una vez en el builder
Manejar cURL, headers Accept y compresión gzip a mano Ya viene configurado en cada petición
Recorrer arrays con claves en inglés (unitCategoryDescription, mainImageURL…) Objetos tipados con getters legibles en español

¿Para qué sirve?

Casos de uso reales que este SDK habilita:


Requisitos

Requisito Versión
PHP >= 7.4 (probado hasta PHP 8.3)
Extensión ext-curl habilitada
Extensión ext-json habilitada
Extensión (recomendada) ext-zlib para descompresión gzip
Dependencia curl/curl ^2.5 (se instala automáticamente)
Red Salida HTTPS hacia api.smart-home.com.co

Instalación

⚠️ Nota de versión importante

La última etiqueta publicada en Packagist es v2.2.1, que expone una API distinta y anterior (SDKSmartInmoBuilder::build() + SmartHomeFacade). Toda esta documentación describe la API actual de la rama main (SDKSmartHomeBuilder), que aún no tiene etiqueta.

Mientras se publica la versión estable, instala la rama de desarrollo:

O fijando el commit para builds reproducibles:

Para el mantenedor: etiquetar v3.0.0 desde main publica esta API como versión estable y permite composer require homlity/sdk-smarthome:^3.0.

Instalación sin Composer

Necesitarás instalar también curl/curl manualmente.

Namespace

El paquete se llama homlity/sdk-smarthome, pero el namespace PHP sigue siendo Codwelt\SDK\SmartHome\ por compatibilidad hacia atrás. No lo confundas:


Credenciales

El SDK necesita hasta tres identificadores, que entrega el equipo de Homlity al habilitar la integración:

Credencial Método Se usa en Ejemplo
Company Code setCompanyCode() Todas las consultas de inventario 695704c3
Project Code setProjectCode() Todas las consultas de inventario 5bec54a5
Project ID setProjectId() Únicamente agregarLead() -IxD-MeYCo32TRLf…

Solicítalos en el portal de desarrolladores de Homlity.

Seguridad: aunque el Company Code y el Project Code viajan en la URL y solo dan acceso de lectura al inventario que ya es público, nunca expongas el projectId en JavaScript del lado del cliente. Las llamadas del SDK deben ejecutarse siempre en el servidor.

Guárdalas fuera del código:


Inicio rápido


Referencia de la API del SDK

SDKSmartHomeBuilder

Clase de entrada. Codwelt\SDK\SmartHome\SDKSmartHomeBuilder.

__construct(string $endpoint = "https://api.smart-home.com.co")

Crea el cliente. Solo necesitas pasar $endpoint si Homlity te asignó un entorno alterno (staging, on-premise):

No incluyas la barra final: el SDK concatena las rutas directamente.

setCompanyCode(string $companyCode): void

Define el código de la inmobiliaria. Obligatorio para todas las consultas de inventario.

setProjectCode(string $projectCode): void

Define el código del proyecto. Obligatorio para todas las consultas de inventario.

setProjectId(string $projectId): void

Define el identificador del proyecto en el CRM. Solo se usa en agregarLead(); si no vas a enviar leads puedes omitirlo.

obtenerPropiedades(): InmueblePreview[]

Devuelve todos los inmuebles del proyecto como un array de InmueblePreview.

obtenerPropiedad(string $unitCode): ?InmuebleDetail

Devuelve el detalle de un inmueble a partir de su código (getCodigo() del listado).

obtenerUbicaciones(): ?Ubicaciones

Devuelve el árbol geográfico del inventario (países, ciudades, localidades, barrios y zonas), con el conteo de inmuebles de cada nodo — ideal para construir filtros.

obtenerTipoPropiedades(): ?TipoPropiedad[]

Devuelve los tipos de inmueble presentes en el inventario, con su conteo.

⚠️ Este método devuelve null (no []) cuando el proyecto no tiene tipos, y en ese caso además emite el aviso foreach() argument must be of type array|object, null given desde dentro del propio SDK. Usa siempre ?? [] antes de iterar.

agregarLead(array $datos): ?string

Registra un contacto en el CRM de Homlity y lo asocia a un inmueble.

Claves del array $datos — todas son obligatorias:

Clave Se envía como Descripción
nombre first_name Nombre del interesado
correo email Correo electrónico
telefono mobile_number Celular, preferiblemente en formato E.164 (+57…)
web origin Origen del lead: dominio, campaña o landing
commentario comment Mensaje del interesado
codigo moduleId getModuleId() del inmueble, no getCodigo()

🔴 Dos detalles que causan la mayoría de los errores:

  1. La clave se escribe commentario (con doble m), tal como la espera el SDK. Si la omites, PHP emitirá un warning de clave indefinida y el comentario viajará vacío.
  2. codigo debe ser el moduleId (un UUID como 35f98252-6db1-43d6-bd6b-18752b883c41), no el código visible del inmueble.

Además, setProjectId() debe haberse llamado antes; de lo contrario el lead llegará sin proyecto asociado.

Devuelve el cuerpo crudo de la respuesta del CRM (string) o null si la petición falló. Comprueba siempre !== null antes de mostrar un mensaje de éxito al usuario.


Modelos de datos

Todos los modelos viven en Codwelt\SDK\SmartHome\InfraStructure\ y son objetos de solo lectura construidos a partir de la respuesta JSON.

InmueblePreview / InmuebleDetail

InmuebleDetail extiende InmueblePreview sin añadir métodos: ambos exponen exactamente la misma interfaz. La diferencia está en el origen de los datos, no en la clase.

Identificación

Método Campo JSON Tipo Notas
getCodigo() code string Código visible del inmueble. Úsalo en obtenerPropiedad()
getModuleId() moduleId string (UUID) Identificador interno. Úsalo en agregarLead()
getNombre() name string Título comercial
getDescripcion() description string Descripción larga, puede traer saltos de línea
getMls() mls array\|null Códigos MLS asociados

Áreas

Método Campo JSON Tipo
getArea() area float — área construida (m²)
getAreaPrivada() privateArea float — área privada (m²)
getAreaLote() lotArea float — área de lote (m²)

Precios

Método Campo JSON Tipo Notas
getValorVenta() price float Precio de venta
getvalorArriendo() monthlyFee float Canon mensual. ⚠️ La v va en minúscula
getMantenimiento() maintenanceFee float Administración
getInmpuesto() tax float Impuesto. ⚠️ Nombre con errata: Inmpuesto
getTieneImpuestos() hasTax bool
getTotalMensualidad() totalMonthlyFee float Canon + administración + impuestos

Gestión y tipo

Método Campo JSON Tipo Notas
getGestionId() unitCategory int Ver catálogo de gestión
getGestion() unitCategoryDescription string "Venta", "Arriendo"…
getTipoUnidadId() unitType int Ver catálogo de tipos
getTipoUnidad() unitTypeDescription string "Apartamento", "Casa"…

Distribución

Método Campo JSON Tipo
getAlcobas() bedroom float
getBanos() bathrooms float
getGarajes() garages int
getEstrato() strata string
getNivel() floor int — piso
getAnoConstruccion() yearBuild int — 0 si no se registró

Ubicación

Método Campo JSON Tipo Notas
getDireccion() address string
getLatitud() latitude float Para mapas
getLongitud() longitude float Para mapas
getCiudad() / getCiudadId() city / cityId string
getLocalidad() / getLocalidadId() locality / localityId ?string Suele venir null
getBarrio() / getBarrioId() neighborhood / neighborhoodId ?string neighborhoodId puede ser null aunque haya nombre
getZona() / getZonaId() zone / zoneId ?string Frecuentemente null

Multimedia y relaciones

Método Campo JSON Devuelve Notas
getImagenDestacada() mainImageURL ?string Puede ser null
getFotos() images Fotos[] ⚠️ Falla si images es null
getCaracteristicas() features Caracteristicas[] ⚠️ Falla si features es null
getAsesor() seller Asesor

⚠️ En inventarios reales, images y features llegan null con frecuencia (en el inventario de demostración: 3 de 15 y 4 de 15 respectivamente). Como los métodos hacen foreach directo sobre el campo, PHP 8 emite el aviso foreach() argument must be of type array|object, null given y el método devuelve [].

No es fatal por sí solo, pero sí es ruido en los logs — y en Laravel, Symfony o cualquier proyecto con un set_error_handler que convierte los avisos en excepciones, sí se convierte en una ErrorException. Usa accesores seguros que cubran ambos escenarios:

Fotos

Representa una pieza multimedia: foto, video o tour virtual.

Método Campo JSON Notas
getNombre() title Si viene vacío, cae al nombre del inmueble — útil como alt
getTipoId() mediaType Ver catálogo multimedia
getUbicacion() source URL absoluta del recurso
getOrden() sequence Entero para ordenar la galería

Caracteristicas

Método Campo JSON
getNombre() name — ej. "BALCON", "ILUMINACION"

Asesor

Datos de contacto del comercial responsable del inmueble.

Método Campo JSON
getNombre() name
getCelular() mobileNumber
getEmail() email

Ubicaciones

Contenedor del árbol geográfico devuelto por obtenerUbicaciones().

Método Devuelve Campo JSON
getPaises() Paises[] countries
getCiudades() Ciudades[] cities
getLocalidades() Localidades[] localities
getBarrios() Barrios[] neighborhoods
getZonas() Paises[] zones — ⚠️ ver nota

⚠️ getZonas() envuelve las zonas en la clase Paises, por lo que getCodigo() leerá countryId y no zoneId. En los proyectos de prueba zones viene vacío, así que rara vez se nota; evita depender de este método hasta que se corrija.

Paises

Método Campo JSON
getCodigo() countryId (UUID)
getNombre() name
getCantidad() count — inmuebles en el país

Ciudades

Método Campo JSON
getCodigo() cityId (UUID)
getPaisId() countryId
getNombre() name
getCantidad() count

Localidades

Método Campo JSON
getCodigo() localityId (UUID)
getCiudadId() cityId
getNombre() name
getCantidad() count

Barrios

Método Campo JSON
getCodigo() neighborhoodId (UUID)
getCiudadId() cityId
getPaisId() countryId
getNombre() name
getCantidad() count

TipoPropiedad

Método Campo JSON
getCodigo() code (int)
getNombre() name
getCantidad() count

Catálogos y códigos

Gestión (unitCategory)

Código Descripción
0 Sin Definir
1 Arriendo
2 Venta
3 Arriendo y Venta

Usa siempre getGestion() para mostrar el texto: la API ya envía la descripción oficial.

Tipos de inmueble (unitType)

Los códigos son estables, pero el catálogo disponible varía por proyecto. Obtén siempre el listado real con obtenerTipoPropiedades(). Valores observados:

Código Nombre
0 Sin Definir
1 Apartamento
2 Casa
4 Oficina
23 Casa Campestre

Tipo de multimedia (mediaType)

Código Contenido Cómo renderizarlo
1 Imagen <img src="…">
3 Video (.mp4) <video controls src="…">
5 Tour virtual 360° (Matterport) <iframe src="…" allowfullscreen>

Ejemplos completos

En la carpeta examples/ encontrarás estos scripts listos para ejecutar.

1. Listado con tarjetas

2. Filtrar en memoria

La API devuelve el inventario completo, así que los filtros se aplican en PHP:

3. Ficha de inmueble con galería

4. Construir filtros desde los catálogos

El atributo data-ciudad de cada barrio permite encadenar los selects en JavaScript sin volver a llamar a la API.

5. Formulario de contacto que envía al CRM

6. Sitemap y feed JSON


Integración con frameworks

Laravel

Registra el SDK como singleton en un ServiceProvider:

Cache::remember serializa los objetos del SDK sin problema: solo contienen arrays.

WordPress

PHP plano con caché en archivo


Buenas prácticas

  1. Cachea siempre. obtenerPropiedades() trae el inventario completo en cada llamada. Un TTL de 10–30 minutos reduce drásticamente la latencia y la carga sobre la API.
  2. Nunca llames al SDK desde el navegador. Las credenciales, y sobre todo el projectId, deben quedarse en el servidor.
  3. Sirve caché rancia ante fallos. Como el SDK devuelve [] en vez de lanzar una excepción, una caída de la API vaciaría tu portal. Conserva la última respuesta buena.
  4. Escapa toda salida. Las descripciones y títulos vienen tal como los cargó la inmobiliaria: usa htmlspecialchars() / esc_html().
  5. Valida antes de renderizar. null, [] y campos ausentes son escenarios normales, no excepcionales.
  6. Registra los fallos. Un agregarLead() que devuelve null es un lead perdido: déjalo en el log y, si es crítico, guarda el formulario en tu base de datos para reintentarlo.
  7. Precarga las imágenes con loading="lazy". Las galerías suelen traer más de 20 fotos en alta resolución.
  8. Usa getModuleId() para leads y getCodigo() para URLs. Confundirlos es el error más frecuente.

Limitaciones y advertencias (importante)

Estas son características actuales del SDK que conviene conocer antes de llevarlo a producción:

# Comportamiento Impacto Cómo mitigarlo
1 Los errores se silencian. Los métodos capturan \Error y devuelven [] / null sin distinguir entre "no hay datos", "credenciales inválidas" y "la API está caída" No puedes reaccionar a un fallo real Envuelve las llamadas y verifica el resultado; conserva caché rancia
2 obtenerTipoPropiedades() devuelve null, no [], si no hay tipos, y además emite un aviso foreach() … null given foreach sobre null en tu código ?? [] antes de iterar
3 getFotos() y getCaracteristicas() avisan si el campo es null en la respuesta Aviso foreach() … null given; devuelven []. Se convierte en ErrorException si tu framework escala los avisos Accesor seguro con @ + try/catch
4 obtenerPropiedad() con un código inexistente devuelve un objeto vacío, no null Cada getter avisa y devuelve null Validar === null y getCodigo() === null
5 Erratas en nombres de métodos: getInmpuesto(), getvalorArriendo() Confusión al autocompletar Documentadas en las tablas de arriba
6 La clave del lead es commentario (doble m) Comentario vacío en el CRM Copiar la clave literal
7 getZonas() devuelve objetos Paises getCodigo() lee countryId Evitar el método por ahora
8 Sin paginación ni filtros del lado del servidor Payload grande en inventarios extensos Cachear y filtrar en PHP
9 Sin timeout de cURL configurable Una API lenta bloquea tu petición Ejecutar la sincronización en un cron, no en la petición del usuario
10 Sin reintentos Un fallo transitorio pierde datos Implementar reintentos con backoff en tu capa
11 La IP del lead se envía fija (10.0.1.1) No refleja el origen real Limitación conocida del SDK
12 Namespace Codwelt\SDK\SmartHome pese al nombre homlity/… Confusión al importar Documentado arriba

Envoltorio recomendado


Endpoints REST subyacentes

Si trabajas en otro lenguaje (Node, Python, Go…), estos son los endpoints que el SDK consume. Base: https://api.smart-home.com.co

Método SDK Verbo Ruta
obtenerPropiedades() GET /api/v1Inmobiliario/getUnits/{companyCode}/{projectCode}
obtenerPropiedad() GET /api/v1Inmobiliario/getUnit/{companyCode}/{projectCode}/{unitCode}
obtenerUbicaciones() GET /api/v1Inmobiliario/getUnitLocation/{companyCode}/{projectCode}
obtenerTipoPropiedades() GET /api/v1Inmobiliario/getUnitType/{companyCode}/{projectCode}
agregarLead() POST /api/SmartInmobiliario

Todas las peticiones envían Accept: application/json y aceptan Content-Encoding: gzip.

Respuesta de getUnits

Los campos agent, listingSites, featuredProperty, status e index existen en la respuesta pero el SDK aún no los expone mediante getters.

Respuesta de getUnitLocation

Respuesta de getUnitType

Cuerpo de POST /api/SmartInmobiliario

Se envía como application/x-www-form-urlencoded.


Solución de problemas

obtenerPropiedades() devuelve un array vacío Recuerda que el SDK no lanza excepciones. Comprueba en este orden: 1. Que llamaste a `setCompanyCode()` **y** `setProjectCode()` antes de consultar. 2. Que los códigos sean correctos (sin espacios ni saltos de línea al copiarlos). 3. Que el servidor tenga salida HTTPS hacia `api.smart-home.com.co`. 4. Que la extensión `curl` esté habilitada: `php -m | grep curl`. Diagnostica el endpoint directamente: Una respuesta correcta empieza con `{"returnCode":"SUCCESS"`.
Warning: foreach() argument must be of type array|object, null given Estás llamando a `getFotos()` o `getCaracteristicas()` sobre un inmueble cuyo campo `images` o `features` viene `null`. Es un escenario habitual, no un error de tu código. En PHP puro es solo un aviso y el método devuelve `[]`. En Laravel, Symfony o cualquier proyecto con un `set_error_handler` que escala los avisos, se convierte en una `ErrorException`. Usa el accesor seguro (`@` + `try/catch`) descrito en [ficha de inmueble](#3-ficha-de-inmueble-con-galería). El mismo aviso aparece dentro de `obtenerTipoPropiedades()` cuando el proyecto no tiene tipos.
Un inmueble responde con todos los campos en null `obtenerPropiedad()` con un código inexistente **no devuelve `null`**: devuelve un `InmuebleDetail` cuyo array interno es `null`. Cada *getter* emite `Trying to access array offset on value of type null` y devuelve `null`. Valida siempre dos condiciones:
El lead no aparece en el CRM 1. ¿Llamaste a `setProjectId()`? Sin él, el lead viaja sin proyecto. 2. ¿Usaste la clave `commentario` con doble *m*? 3. ¿Enviaste `getModuleId()` (UUID) en `codigo`, y no `getCodigo()`? 4. ¿`agregarLead()` devolvió `null`? Entonces la petición HTTP falló.
La respuesta llega comprimida o ilegible El SDK pide `gzip`. Si tu PHP no tiene `ext-zlib`, cURL no puede descomprimir. Verifica con `php -m | grep zlib`.
Composer instala una versión con otra API Es el caso descrito en [Instalación](#️-nota-de-versión-importante): la etiqueta `v2.2.1` expone `SDKSmartInmoBuilder` en vez de `SDKSmartHomeBuilder`. Usa `dev-main` mientras se publica la versión estable.
Class "Codwelt\SDK\SmartHome\SDKSmartHomeBuilder" not found 1. ¿Incluiste `vendor/autoload.php`? 2. ¿Estás en `dev-main`? En `v2.2.1` esa clase no existe. 3. Regenera el autoloader: `composer dump-autoload`.

Pruebas

La suite actual (tests/IndexTestCase.php) es un esqueleto mínimo y no cubre la API vigente: construye SDKSmartHomeBuilder pasando el companyCode al constructor, cuando el constructor espera un endpoint. Trátala como código heredado, no como referencia de uso.

Para probar contra la API real sin tocar el CRM, usa únicamente los métodos de lectura y las credenciales de demostración incluidas en index.php.


Versionado y changelog

El proyecto sigue SemVer y Keep a Changelog. Consulta CHANGELOG.md.

Versión Estado API pública
dev-main Actual, sin etiquetar SDKSmartHomeBuilder + InfraStructure\*
v2.2.1 Última etiqueta en Packagist SDKSmartInmoBuilder::build() + SmartHomeFacade
v1.x Obsoleta —

Soporte

Canal Enlace
Sitio principal https://homlity.com/
Portal de desarrolladores https://homlity.com/desarrolladores/
Repositorio https://github.com/homlity/sdk-smartinmobiliario
Reportar un error https://github.com/homlity/sdk-smartinmobiliario/issues
Packagist https://packagist.org/packages/homlity/sdk-smarthome

Otros SDK de Homlity

Paquete Para qué sirve
homlity/sdk-smarthome Inventario inmobiliario y leads (este paquete)
homlity/sdk-proppit Publicación de inmuebles en Proppit desde PHP/Laravel

Homlity para desarrolladores

Hecho por Homlity · homlity.com


All versions of sdk-smarthome with dependencies

PHP Build Version
Package Version
Requires php Version >=7.4
curl/curl Version ^2.5
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package homlity/sdk-smarthome contains the following files

Loading the files please wait ...