PHP code example of homlity / sdk-smarthome
1. Go to this page and download the library: Download homlity/sdk-smarthome library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
homlity / sdk-smarthome example snippets
$propiedades = $sdk->obtenerPropiedades();
echo $propiedades[0]->getNombre(); // "VENTA DE OFICINA EN CENTRO COMERCIAL PRIMAVERA"
echo $propiedades[0]->getValorVenta(); // 650000000.00
echo $propiedades[0]->getCiudad(); // "VILLAVICENCIO"
spl_autoload_register(function ($class) {
$prefix = 'Codwelt\\SDK\\SmartHome\\';
$baseDir = __DIR__ . '/sdk-smartinmobiliario/src/';
if (strncmp($prefix, $class, strlen($prefix)) !== 0) {
return;
}
$file = $baseDir . str_replace('\\', '/', substr($class, strlen($prefix))) . '.php';
if (file_exists($file)) {
use Codwelt\SDK\SmartHome\SDKSmartHomeBuilder;
$sdk = new SDKSmartHomeBuilder();
$sdk->setCompanyCode(getenv('HOMLITY_COMPANY_CODE'));
$sdk->setProjectCode(getenv('HOMLITY_PROJECT_CODE'));
$sdk->setProjectId(getenv('HOMLITY_PROJECT_ID'));
Codwelt\SDK\SmartHome\SDKSmartHomeBuilder;
$sdk = new SDKSmartHomeBuilder();
$sdk->setCompanyCode('695704c3');
$sdk->setProjectCode('5bec54a5');
$sdk->setProjectId('-IxD-MeYCo32TRLfUCbfBpdb1rxYAsdHPqc1GL0Mc9CAdWenV8FW/V6iQAgBl-Zh');
// 1. Listado de inmuebles
$propiedades = $sdk->obtenerPropiedades();
// 2. Detalle de uno
$propiedad = $sdk->obtenerPropiedad($propiedades[0]->getCodigo());
// 3. Catálogo de ubicaciones
$ubicaciones = $sdk->obtenerUbicaciones();
// 4. Catálogo de tipos de inmueble
$tipos = $sdk->obtenerTipoPropiedades();
// 5. Registrar un lead en el CRM
$idLead = $sdk->agregarLead([
'nombre' => 'Sergio Wiesner',
'correo' => '[email protected] ',
'telefono' => '+573506573588',
'web' => 'mi-inmobiliaria.com',
'commentario' => 'Quiero agendar una visita',
'codigo' => $propiedad->getModuleId(),
]);
$sdk = new SDKSmartHomeBuilder(); // producción
$sdk = new SDKSmartHomeBuilder('https://staging.ejemplo.co'); // entorno alterno
$propiedades = $sdk->obtenerPropiedades();
foreach ($propiedades as $p) {
printf("%s — %s — $%s\n", $p->getCodigo(), $p->getNombre(), number_format($p->getValorVenta()));
}
$propiedad = $sdk->obtenerPropiedad('20230022');
if ($propiedad === null || $propiedad->getCodigo() === null) {
http_response_code(404);
exit('Inmueble no disponible');
}
$ubicaciones = $sdk->obtenerUbicaciones();
foreach ($ubicaciones->getCiudades() as $ciudad) {
echo $ciudad->getNombre() . ' (' . $ciudad->getCantidad() . ")\n";
}
// VILLAVICENCIO (12)
// ACACIAS (2)
foreach ($sdk->obtenerTipoPropiedades() ?? [] as $tipo) {
echo "{$tipo->getCodigo()} · {$tipo->getNombre()} ({$tipo->getCantidad()})\n";
}
// 1 · Apartamento (6)
// 2 · Casa (6)
// 4 · Oficina (2)
$respuesta = $sdk->agregarLead([
'nombre' => 'Ana Ramírez',
'correo' => '[email protected] ',
'telefono' => '+573001112233',
'web' => 'mi-inmobiliaria.com',
'commentario' => 'Me interesa agendar una visita el sábado',
'codigo' => $propiedad->getModuleId(),
]);
> function fotosSeguras(InmueblePreview $inmueble): array
> {
> try {
> $fotos = @$inmueble->getFotos(); // silencia el aviso de foreach sobre null
> return is_array($fotos) ? $fotos : [];
> } catch (\Throwable $e) { // frameworks que convierten avisos en excepciones
> return [];
> }
> }
>
usort($fotos, fn($a, $b) => $a->getOrden() <=> $b->getOrden());
foreach ($fotos as $foto) {
if ($foto->getTipoId() === 1) {
echo '<img src="' . htmlspecialchars($foto->getUbicacion()) . '"
alt="' . htmlspecialchars($foto->getNombre()) . '">';
}
}
$asesor = $propiedad->getAsesor();
$wa = 'https://wa.me/57' . preg_replace('/\D/', '', $asesor->getCelular());
echo '<a href="' . $wa . '">Escribir a ' . htmlspecialchars($asesor->getNombre()) . '</a>';
Codwelt\SDK\SmartHome\SDKSmartHomeBuilder;
$sdk = new SDKSmartHomeBuilder();
$sdk->setCompanyCode(getenv('HOMLITY_COMPANY_CODE'));
$sdk->setProjectCode(getenv('HOMLITY_PROJECT_CODE'));
$propiedades = $sdk->obtenerPropiedades();
if ($propiedades === []) {
echo '<p>No hay inmuebles disponibles en este momento.</p>';
return;
}
foreach ($propiedades as $p) {
$imagen = $p->getImagenDestacada() ?: '/img/placeholder.jpg';
$precio = $p->getGestionId() === 1 ? $p->getvalorArriendo() : $p->getValorVenta();
$filtrados = array_values(array_filter($propiedades, function ($p) {
return $p->getGestionId() === 2 // solo venta
&& $p->getCiudadId() === '454cca01-1f8e-4c4e-91ba-24ce3a37f19f'
&& $p->getAlcobas() >= 3
&& $p->getValorVenta() <= 500000000;
}));
// Ordenar por precio ascendente
usort($filtrados, fn($a, $b) => $a->getValorVenta() <=> $b->getValorVenta());
// Paginar
$pagina = max(1, (int) ($_GET['pagina'] ?? 1));
$porPagina = 12;
$total = count($filtrados);
$visibles = array_slice($filtrados, ($pagina - 1) * $porPagina, $porPagina);
$paginas = (int) ceil($total / $porPagina);
$codigo = $_GET['codigo'] ?? null;
if (!$codigo) {
http_response_code(400);
exit('Falta el código del inmueble');
}
// La @ silencia el aviso que el SDK emite cuando el código no existe
$propiedad = @$sdk->obtenerPropiedad($codigo);
// Doble validación: null (fallo de red) u objeto vacío (código inexistente)
if ($propiedad === null || $propiedad->getCodigo() === null) {
http_response_code(404);
exit('Inmueble no encontrado');
}
// Accesor seguro: `images` / `features` pueden venir null en la respuesta
function seguro(callable $fn): array
{
try {
$r = @$fn();
return is_array($r) ? $r : [];
} catch (\Throwable $e) {
return [];
}
}
$fotos = seguro(fn() => $propiedad->getFotos());
usort($fotos, fn($a, $b) => $a->getOrden() <=> $b->getOrden());
$imagenes = array_filter($fotos, fn($f) => $f->getTipoId() === 1);
$videos = array_filter($fotos, fn($f) => $f->getTipoId() === 3);
$tours = array_filter($fotos, fn($f) => $f->getTipoId() === 5);
$caracteristicas = seguro(fn() => $propiedad->getCaracteristicas());
$ubicaciones = $sdk->obtenerUbicaciones();
$tipos = $sdk->obtenerTipoPropiedades() ?? [];
Codwelt\SDK\SmartHome\SDKSmartHomeBuilder;
$errores = [];
$exito = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 1. Validación en tu lado
$nombre = trim($_POST['nombre'] ?? '');
$correo = filter_input(INPUT_POST, 'correo', FILTER_VALIDATE_EMAIL) ?: '';
$telefono = preg_replace('/[^\d+]/', '', $_POST['telefono'] ?? '');
$mensaje = trim($_POST['mensaje'] ?? '');
$moduleId = $_POST['module_id'] ?? '';
if ($nombre === '') { $errores[] = 'El nombre es obligatorio.'; }
if ($correo === '') { $errores[] = 'El correo no es válido.'; }
if ($telefono === '') { $errores[] = 'El teléfono es obligatorio.'; }
if ($moduleId === '') { $errores[] = 'No se pudo identificar el inmueble.'; }
// 2. Envío al CRM
if ($errores === []) {
$sdk = new SDKSmartHomeBuilder();
$sdk->setCompanyCode(getenv('HOMLITY_COMPANY_CODE'));
$sdk->setProjectCode(getenv('HOMLITY_PROJECT_CODE'));
$sdk->setProjectId(getenv('HOMLITY_PROJECT_ID')); // imprescindible para leads
$respuesta = $sdk->agregarLead([
'nombre' => $nombre,
'correo' => $correo,
'telefono' => $telefono,
'web' => $_SERVER['HTTP_HOST'] ?? 'sitio-web',
'commentario' => $mensaje, // ojo: doble "m"
'codigo' => $moduleId, // moduleId, no code
]);
if ($respuesta === null) {
$errores[] = 'No pudimos enviar tu solicitud. Intenta de nuevo.';
error_log('[Homlity SDK] agregarLead devolvió null para ' . $correo);
} else {
$exito = true;
}
}
}
// sitemap-inmuebles.xml
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"
// feed.json — para un buscador en el front (Algolia, Fuse.js, etc.)
header('Content-Type: application/json; charset=utf-8');
echo json_encode(array_map(fn($p) => [
'codigo' => $p->getCodigo(),
'nombre' => $p->getNombre(),
'tipo' => $p->getTipoUnidad(),
'gestion' => $p->getGestion(),
'ciudad' => $p->getCiudad(),
'barrio' => $p->getBarrio(),
'precio' => $p->getValorVenta(),
'area' => $p->getArea(),
'alcobas' => $p->getAlcobas(),
'banos' => $p->getBanos(),
'imagen' => $p->getImagenDestacada(),
'lat' => $p->getLatitud(),
'lng' => $p->getLongitud(),
], $sdk->obtenerPropiedades()), JSON_UNESCAPED_UNICODE);
// app/Providers/AppServiceProvider.php
use Codwelt\SDK\SmartHome\SDKSmartHomeBuilder;
public function register(): void
{
$this->app->singleton(SDKSmartHomeBuilder::class, function () {
$sdk = new SDKSmartHomeBuilder(config('homlity.endpoint'));
$sdk->setCompanyCode(config('homlity.company_code'));
$sdk->setProjectCode(config('homlity.project_code'));
$sdk->setProjectId(config('homlity.project_id'));
return $sdk;
});
}
// config/homlity.php
return [
'endpoint' => env('HOMLITY_ENDPOINT', 'https://api.smart-home.com.co'),
'company_code' => env('HOMLITY_COMPANY_CODE'),
'project_code' => env('HOMLITY_PROJECT_CODE'),
'project_id' => env('HOMLITY_PROJECT_ID'),
];
// app/Http/Controllers/InmuebleController.php
public function index(SDKSmartHomeBuilder $sdk)
{
$propiedades = Cache::remember('homlity.inmuebles', now()->addMinutes(15),
fn() => $sdk->obtenerPropiedades()
);
return view('inmuebles.index', compact('propiedades'));
}
// functions.php
\SmartHome\SDKSmartHomeBuilder;
function homlity_sdk(): SDKSmartHomeBuilder {
static $sdk = null;
if ($sdk === null) {
$sdk = new SDKSmartHomeBuilder();
$sdk->setCompanyCode(HOMLITY_COMPANY_CODE);
$sdk->setProjectCode(HOMLITY_PROJECT_CODE);
$sdk->setProjectId(HOMLITY_PROJECT_ID);
}
return $sdk;
}
function homlity_inmuebles(): array {
$cache = get_transient('homlity_inmuebles');
if ($cache !== false) {
return $cache;
}
$propiedades = homlity_sdk()->obtenerPropiedades();
set_transient('homlity_inmuebles', $propiedades, 15 * MINUTE_IN_SECONDS);
return $propiedades;
}
// Shortcode: [homlity_inmuebles limite="6"]
add_shortcode('homlity_inmuebles', function ($atts) {
$atts = shortcode_atts(['limite' => 6], $atts);
$items = array_slice(homlity_inmuebles(), 0, (int) $atts['limite']);
ob_start();
foreach ($items as $p) {
printf('<article><h3>%s</h3><p>%s</p></article>',
esc_html($p->getNombre()),
esc_html(number_format($p->getValorVenta(), 0, ',', '.'))
);
}
return ob_get_clean();
});
function homlityInmuebles(SDKSmartHomeBuilder $sdk, int $ttl = 900): array
{
$archivo = sys_get_temp_dir() . '/homlity-inmuebles.cache';
if (is_file($archivo) && (time() - filemtime($archivo)) < $ttl) {
$datos = @unserialize(file_get_contents($archivo));
if ($datos !== false) {
return $datos;
}
}
$propiedades = $sdk->obtenerPropiedades();
// No sobrescribas una caché válida con una respuesta vacía
if ($propiedades !== []) {
file_put_contents($archivo, serialize($propiedades), LOCK_EX);
} elseif (is_file($archivo)) {
return unserialize(file_get_contents($archivo)); // sirve la caché rancia
}
return $propiedades;
}
final class HomlityRepositorio
{
public function __construct(
private SDKSmartHomeBuilder $sdk,
private ?\Psr\Log\LoggerInterface $logger = null
) {}
/** @return InmueblePreview[] */
public function inmuebles(): array
{
$resultado = $this->sdk->obtenerPropiedades();
if ($resultado === []) {
$this->logger?->warning('[Homlity] Inventario vacío: ¿API caída o credenciales inválidas?');
}
return $resultado;
}
public function inmueble(string $codigo): ?InmuebleDetail
{
try {
$inmueble = $this->sdk->obtenerPropiedad($codigo);
} catch (\Throwable $e) {
$this->logger?->error('[Homlity] Error al obtener ' . $codigo, ['excepcion' => $e]);
return null;
}
// Un código inexistente devuelve un objeto vacío, no null
if ($inmueble === null || @$inmueble->getCodigo() === null) {
return null;
}
return $inmueble;
}
/** @return Fotos[] */
public function fotos(InmueblePreview $inmueble): array
{
try {
$fotos = @$inmueble->getFotos();
return is_array($fotos) ? $fotos : [];
} catch (\Throwable) {
return [];
}
}
/** @return Caracteristicas[] */
public function caracteristicas(InmueblePreview $inmueble): array
{
try {
$cars = @$inmueble->getCaracteristicas();
return is_array($cars) ? $cars : [];
} catch (\Throwable) {
return [];
}
}
}
if ($propiedad === null || $propiedad->getCodigo() === null) {
// no existe
}