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
}