> For the complete documentation index, see [llms.txt](https://navixy.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://navixy.com/docs/user/es/guide/account/iot-logic/nodes/geofence-functions.md).

# Funciones de Zona

Use las zonas que ya tiene en Navixy dentro de los flujos de IoT Logic para actuar cuando un dispositivo entra o sale de un área, o para registrar en qué área se encuentra.

Las funciones de zona permiten que un flujo reaccione según dónde se encuentra un dispositivo, usando las zonas que ya tiene en Navixy. Usted hace referencia a una zona en lugar de describir un área con coordenadas, de modo que los límites sigan siendo los mismos que ya usa para alertas y reportes.

## Qué función necesita

| Si desea                                                                                                  | Use                                                                                                              |
| --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Actuar sobre una zona específica, cuando un dispositivo está dentro de ella, entra en ella o sale de ella | `inGeofence()`, `enterGeofence()`, `leaveGeofence()`. Consulte [Responder a una zona](#reacting-to-one-geofence) |
| Descubrir en qué zona está un dispositivo, sin nombrar una de antemano                                    | `geofenceName()`. Consulte [Registrar la zona actual](#recording-the-current-geofence)                           |

{% hint style="warning" %}
Debe crear zonas en Navixy antes de poder referenciarlas en expresiones de IoT Logic. Para crear o administrar zonas, consulte [Zonas](/docs/user/es/guide/tracking/map-tools/geofences.md).
{% endhint %}

{% hint style="danger" %}
**`geofenceName()` es una opción de pago, que se vende por separado.** Viene desactivada de forma predeterminada para todas las cuentas, y su proveedor de servicio la activa por cuenta, a solicitud. Las otras tres funciones no se ven afectadas y no requieren una opción adicional.

Póngase en contacto con su proveedor de servicio para que la active. Consulte [Antes de empezar](#before-you-start).
{% endhint %}

## Responder a una zona

Use estas tres funciones cuando ya sabe qué zona importa. Cada una responde sí o no para la mayoría de los paquetes de datos que envía el dispositivo, de modo que un flujo pueda enviar esos datos por una rama o por otra. En algunos paquetes una función no puede responder y, en su lugar, devuelve un valor vacío. Consulte [Cuando una función de zona no da respuesta](#when-a-geofence-function-gives-no-answer).

| Función             | Responde sí cuando                                    |
| ------------------- | ----------------------------------------------------- |
| `inGeofence(id)`    | El dispositivo está dentro de la zona en este momento |
| `enterGeofence(id)` | El dispositivo acaba de entrar en la zona             |
| `leaveGeofence(id)` | El dispositivo acaba de salir de la zona              |

Las agrega a la condición de un **IF/THEN Lógica** nodo. El `id` es el ID numérico de la zona en su cuenta de Navixy, y un selector lo completa por usted, por lo que rara vez lo escribe manualmente. Consulte [Cómo agregar una condición de zona](#how-to-add-a-geofence-condition).

### Cuando una función de zona no da respuesta

`inGeofence()`, `enterGeofence()`, y `leaveGeofence()` devuelven un valor vacío en lugar de sí o no cuando no pueden responder. Una función no puede responder en estos casos:

* El paquete de datos no incluye coordenadas. Aun así, se evalúa una posición de baja calidad, por lo que una señal GPS débil devuelve un sí o no real.
* La zona se eliminó de su cuenta de Navixy o se volvió inaccesible después de guardar el flujo. En cambio, una zona que ya falta cuando guarda el flujo se rechaza al guardar.

Un valor vacío detiene la condición de la que forma parte. Cuando la función constituye toda la condición, los datos van a la ruta ELSE. Ese enrutamiento suele ser el que usted quiere. Cuando la función se combina con cualquier otra cosa, el valor vacío puede detener toda la condición, incluidos los términos que sí tenían valores. Para que el resto de la condición siga funcionando, compare la función con `== true`:

```jexl
leaveGeofence(51577 /* Austin Warehouse */) == true || leaveGeofence(85269 /* Construction site 1 */) == true
```

Para la regla completa, consulte [Valores faltantes en expresiones](/docs/user/es/guide/account/iot-logic/nodes/missing-values-in-expressions.md).

### Sintaxis

{% tabs %}
{% tab title="Posición actual" %}
Este es el formato que inserta automáticamente el selector de zonas. El nombre de la zona aparece como comentario para facilitar la lectura, pero no afecta la evaluación.

```jexl
inGeofence(35229 /* Delivery zone #4 */)
enterGeofence(51577 /* Austin Warehouse */)
leaveGeofence(85269 /* Construction site 1 */)
```

{% endtab %}

{% tab title="Posición histórica" %}
`inGeofence()` acepta dos parámetros más, por lo que puede comprobar una posición anterior en lugar de la actual:

```jexl
inGeofence(35229 /* Delivery zone #4 */, 1)
inGeofence(35229 /* Delivery zone #4 */, 1, 'valid')
inGeofence(35229 /* Delivery zone #4 */, 'valid')
```

El segundo parámetro indica de qué paquete de datos tomar la posición, contando hacia atrás desde el actual. El tercero indica si se deben contar los paquetes que no contienen posición. Ambos son opcionales y siguen la misma convención que la `value()` función.

`enterGeofence()` y `leaveGeofence()` toman el ID de la zona y nada más. Ambas comparan la posición actual con la anterior, por lo que no hay un índice que elegir. Un flujo que pase un segundo parámetro a cualquiera de las dos funciones no se puede guardar, y el error indica el nombre de la función.

Mantenga el índice en el rango de 0 a 11. `inGeofence()` acepta un índice mayor, se guarda sin error y luego devuelve un valor vacío para cada paquete.

No envuelva una función de zona dentro de `value()`. El primer parámetro de `value()` es un nombre de atributo, no una expresión, por lo que una llamada como `value("inGeofence(35229)", 1, 'valid')` busca un atributo con ese nombre literal y siempre devuelve un valor vacío.

Para `value()` ver los detalles de la función, consulte [Expresiones y sintaxis de IF/THEN Lógica](/docs/user/es/guide/account/iot-logic/nodes/logic-node/logic-node-expressions-and-syntax.md).
{% endtab %}
{% endtabs %}

### Cómo agregar una condición de zona

El campo de expresión en el **IF/THEN Lógica** panel de configuración del Nodo incluye un selector de zona dedicado <img src="https://1900701122-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-f1ad9487846cd008c17c7a3a86c7f52b4f8d899d%2Fgeofence-picker.png?alt=media" alt="" data-size="line">, separado del autocompletado estándar de [atributos](/docs/user/es/guide/account/iot-logic/nodes/initiate-attribute-node/managing-attributes.md#autofill-attribute-names). Enumera todas las zonas definidas en su cuenta de Navixy, agrupadas por nombre e ID.

Para agregar una función de zona a su expresión:

{% stepper %}
{% step %}

#### Abra la configuración del Nodo

Abra el **IF/THEN Lógica** Nodo haciendo clic en él en el lienzo.
{% endstep %}

{% step %}

#### Abra el selector de zona

En el **Expresión de condición (JEXL)** campo, haga clic en el icono del selector de zona para abrir la lista de zonas.

<figure><img src="https://1900701122-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-4e9a17bca5a836559c33502a97f6c418f3504898%2Fgeofence-picker-list.png?alt=media" alt="Geofence picker list example, with all three options (in, enter, leave geofence)"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Busque y seleccione una zona

Escriba parte del nombre de la zona para filtrar la lista. Cada zona aparece tres veces, una por cada función disponible. Seleccione la entrada que combine la zona que necesita con la función que coincida con su condición:

* `inGeofence` - úsela cuando necesite comprobar si un dispositivo se encuentra actualmente dentro de la zona seleccionada.
* `enterGeofence` - úsela cuando necesite detectar que un dispositivo pasó desde fuera de la zona seleccionada hacia dentro de ella.
* `leaveGeofence` - úsela cuando necesite detectar que un dispositivo pasó desde dentro de la zona seleccionada hacia fuera de ella.

El selector inserta la llamada completa a la función en la posición del cursor del campo de expresión.
{% endstep %}

{% step %}

#### Combínelo con otras condiciones si es necesario

Use operadores lógicos para combinar la función de zona con otras condiciones. Consulte [Ejemplos de condiciones](#condition-examples).
{% endstep %}

{% step %}

#### Guarde la configuración

Haga clic en **Aplicar cambios** para confirmar la configuración del Nodo.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
El selector de zona solo muestra las zonas que existen en su cuenta de Navixy en el momento en que abre el Nodo. Si agrega una nueva zona después de abrir el Nodo, ciérrelo y vuelva a abrirlo para actualizar la lista.
{% endhint %}

El selector inserta solo las tres funciones basadas en ID. Para usar `geofenceName()`, escríbalo usted mismo en el campo.

### Ejemplos de condiciones

<details>

<summary>Condición de una sola zona</summary>

Datos de ruta según si un dispositivo se encuentra actualmente dentro de una zona de entrega:

```jexl
inGeofence(35229 /* Delivery zone #4 */)
```

* **Ruta ENTONCES**: Los datos de dispositivos dentro de la zona fluyen aquí. Use esta rama para activar un procesamiento específico de la zona, como ajustar los umbrales de velocidad o iniciar un atributo de temporizador de permanencia.
* **Ruta SINO**: Los datos de dispositivos fuera de la zona fluyen aquí para un procesamiento estándar.

</details>

<details>

<summary>Detección de entrada</summary>

Active una acción cuando un vehículo entre en un sitio restringido:

```jexl
enterGeofence(85269 /* Obra 1 */)
```

* **Ruta ENTONCES**: Conéctese a un **Webhook** nodo para notificar a seguridad del sitio, o a un **Acción del dispositivo** nodo para registrar el evento de entrada.
* **Ruta SINO**: Continúe con el procesamiento normal de datos para dispositivos que no entren al sitio.

</details>

<details>

<summary>Detección de salida</summary>

Detecte cuándo un vehículo salga de un área de servicio autorizada durante el horario comercial:

```jexl
leaveGeofence(51577 /* Almacén de Austin */) == true && value('business_hours', 0, 'valid') == true
```

* **Ruta ENTONCES**: Envíe una alerta mediante un **Webhook** nodo a un sistema de despacho.
* **Ruta SINO**: Continúe con el procesamiento normal.

</details>

<details>

<summary>Combinar varias zonas</summary>

Compruebe si un dispositivo está dentro de alguna de varias zonas restringidas:

```jexl
inGeofence(35229 /* Zona de entrega #4 */) == true || inGeofence(85269 /* Obra 1 */) == true
```

Cada función se compara con `== true`, por lo que un paquete en el que una de ellas no pueda decidir no detiene toda la condición. Sin la comparación, la primera función que devuelve un valor vacío detiene la condición y las otras zonas nunca se prueban. Consulte [Cuando una función de zona no da respuesta](#when-a-geofence-function-gives-no-answer).

* **Ruta ENTONCES**: Aplique reglas o notificaciones específicas de la zona.
* **Ruta SINO**: Procese los datos de dispositivos fuera de todas las zonas enumeradas.

</details>

<details>

<summary>Zona combinada con un parámetro del dispositivo</summary>

Detecte casos de sobre exceso de velocidad dentro de una zona urbana específica:

```jexl
inGeofence(84762 /* destino1 */) == true && value('speed', 0, 'valid') > 50
```

* **Ruta ENTONCES**: Registre una Violación de velocidad específica de esa zona, o envíe una alerta dirigida.
* **Ruta SINO**: Continúe con el procesamiento estándar para datos conformes o fuera de la zona.

</details>

<details>

<summary>Comparar con la posición anterior</summary>

Detecte una transición de fuera a dentro comparando la posición actual con la anterior:

```jexl
inGeofence(35229 /* Zona de entrega #4 */) == true && inGeofence(35229 /* Zona de entrega #4 */, 1, 'valid') == false
```

Esta expresión devuelve `true` solo en el primer paquete después de que un dispositivo entra en la zona. `enterGeofence()` hace lo mismo en una sola llamada, así que use esta forma solo cuando necesite un índice diferente al del paquete anterior.

La segunda llamada se compara con `== false`, por lo que la expresión se activa solo cuando la posición anterior es conocida y estaba fuera de la zona. Un dispositivo sin una posición válida anterior no coincide. No escriba el segundo término como `!inGeofence(...)`, lo que no produce ningún resultado en absoluto cuando no hay una posición anterior que comprobar.

</details>

## Registrar la zona actual

`geofenceName()` le indica en qué zona se encuentra un dispositivo, en lugar de probar una zona que usted eligió de antemano. Devuelve el nombre como texto y usted almacena ese texto en un atributo propio.

Una sola fórmula cubre todas las zonas que tenga. No construye una cadena de comprobaciones por zona ni edita el flujo cada vez que agrega una zona. Esto es lo que contiene el atributo para un vehículo de entrega que reporta a lo largo del día:

| Paquete de datos | `zona_actual`         |
| ---------------- | --------------------- |
| 08:14            | `Garaje principal`    |
| 09:02            | (vacío)               |
| 09:47            | `Sitio del cliente 3` |

Usted lo crea como un atributo calculado en un **Iniciar atributo** nodo. A partir de allí, se comporta como cualquier otro atributo calculado: aparece en [Analizador de datos](/docs/user/es/guide/account/iot-logic/data-stream-analyzer.md), puede mostrarse en la plataforma como un sensor personalizado y puede reenviarse a un sistema externo.

### Antes de empezar

**La opción debe activarse en su cuenta.** `geofenceName()` se vende por separado y está desactivado de forma predeterminada para todos. Póngase en contacto con su proveedor de servicios y pídale que habilite la función de nombre de zona para su cuenta. Ayuda citar el nombre interno de la función, `iot_logic_zona_search`.

Hasta que se active, no se podrá guardar un flujo que use la función. El Nodo se marca con este error:

```
La función geofenceName() en el Nodo "Resolver zona actual" (#2) no está disponible para su cuenta
```

Elimine la función del Nodo para guardar el flujo, o espere hasta que su proveedor de servicios active la opción.

**También necesita geocercas para realizar la búsqueda.**

* Al menos una Zona existe en su cuenta. Consulte [Zonas](/docs/user/es/guide/tracking/map-tools/geofences.md).
* Para buscar solo una parte de sus geocercas, asígneles una Etiqueta. Consulte [Use Etiquetas](/docs/user/es/guide/tracking/map-tools/geofences.md#use-tags) y [Etiquetas](/docs/user/es/guide/account/tags.md).

### Agregue el atributo

Cree un atributo calculado de la forma habitual, como se describe en [Administrar atributos](/docs/user/es/guide/account/iot-logic/nodes/initiate-attribute-node/managing-attributes.md#creating-attributes), e ingrese una de las fórmulas siguientes en el **Fórmula** campo.

Escriba usted mismo el nombre de la función. El autocompletado de atributos no ofrece `geofenceName`, y el selector de zona está disponible solo en el **IF/THEN Lógica** nodo.

### Fórmulas

Las dos primeras formas cubren la mayoría de los casos. La tercera lee una posición anterior en lugar de la actual.

| Fórmula                        | Qué devuelve                                                                                 |
| ------------------------------ | -------------------------------------------------------------------------------------------- |
| `geofenceName()`               | El nombre de cualquier zona en la que se encuentre actualmente el dispositivo                |
| `geofenceName('depots')`       | El nombre de una zona etiquetada `depots` en la que se encuentra actualmente el dispositivo  |
| `geofenceName('', 1, 'valid')` | El nombre de cualquier zona en la que se encontraba el dispositivo un paquete de datos antes |

Los tres parámetros son opcionales:

* **La etiqueta**, en primer lugar, limita la búsqueda a las geocercas a las que asignó esa etiqueta. No importa si está en mayúsculas o minúsculas, y una etiqueta vacía significa todas las geocercas. Etiquetar importa cuando tiene muchas geocercas y solo algunas son relevantes para este atributo, por ejemplo, depósitos pero no sitios de clientes.
* **El número de paquete**, en segundo lugar, indica hasta qué punto retroceder: `0` es el paquete que se está procesando, `1` el anterior, y así sucesivamente. Omítalo para la posición actual.
* **El filtro de posición**, en tercer lugar, es `'válido'` para omitir los paquetes que no contenían posición, o `'all'` para contarlos. Déjelo fuera y se contarán los paquetes sin posición.

Para conocer los límites exactos de cada parámetro, consulte [Función del nombre de la zona](/docs/iot-logic-api/technical-details/geofence-name.md) en la documentación de la API de IoT Logic.

### Lo que devuelve

El atributo contiene el nombre de la zona como texto, o un valor vacío cuando no hay un nombre que proporcionar. Está vacío cuando:

* El dispositivo está fuera de todas las zonas buscadas.
* El paquete de datos no contiene posición.
* Ninguna zona de su cuenta tiene la etiqueta que proporcionó.

Un valor vacío se ve igual en los tres casos. En una fórmula, este valor vacío se escribe como `null`, que es como el ejemplo de enrutamiento que aparece abajo lo comprueba.

Para obtener texto legible en lugar de un espacio en blanco, agregue un valor de reserva con el `?:` operador:

```jexl
geofenceName() ?: 'Fuera de todas las zonas'
```

Cuando una posición cae dentro de dos zonas superpuestas, la función devuelve uno de los dos nombres. Navixy no clasifica las zonas superpuestas, y se devuelve el mismo nombre mientras el dispositivo permanezca en la superposición.

### Ejemplos de fórmulas

<details>

<summary>Nombre actual de la zona como atributo</summary>

En un **Iniciar atributo** nodo, cree un atributo llamado `zona_actual` con esta fórmula:

```jexl
geofenceName()
```

Cada paquete de datos registrado dentro de una zona recibe el nombre de esa zona. Los paquetes registrados fuera de todas las zonas reciben un valor vacío.

</details>

<details>

<summary>Solo las zonas que etiquetó</summary>

Etiquete sus zonas de garaje con `depots`, luego cree un atributo con esta fórmula:

```jexl
geofenceName('depots') ?: 'En tránsito'
```

Un dispositivo dentro de un garaje recibe el nombre de ese garaje. Un dispositivo en cualquier otro lugar recibe `En tránsito`, incluso un dispositivo dentro de una zona que no tiene `depots` etiqueta.

</details>

<details>

<summary>Enrutamiento por área en un nodo IF/THEN Lógica</summary>

`geofenceName()` también funciona como condición, lo que es útil cuando muchas zonas comparten una sola regla. Para enviar al flujo THEN los datos registrados dentro de cualquier zona etiquetada `restricted` por la ruta THEN, use esta condición:

```jexl
geofenceName('restricted') != null
```

* **Ruta ENTONCES**: Datos registrados dentro de una zona restringida. Conéctelo a un **Webhook** nodo para alertar a un despachador.
* **Ruta SINO**: Todos los demás datos.

Compare el resultado con `==` o `!=` solo. Los `<`, `>`, `<=`, y `>=` operadores no dan un resultado útil cuando el valor está vacío.

</details>

<details>

<summary>Detección de un cambio de área</summary>

Para activarlo solo en el paquete en el que el dispositivo cambia de zona, compare el nombre actual con el nombre de la posición anterior:

```jexl
geofenceName() != geofenceName('', 1, 'valid')
```

El primer parámetro vacío significa todas las zonas, y `'válido'` hace que la comparación omita los paquetes que no contenían posición. Sin `'válido'`, un paquete sin posición se interpreta como un nombre de zona vacío, y la condición informa un cambio que no ocurrió.

</details>

## Preguntas frecuentes

#### ¿Dónde encuentro el ID de la Zona?

El selector de Zona muestra en la lista el nombre y el ID numérico de cada Zona. También puede encontrar el ID en la interfaz de Zonas de Navixy. Cuando selecciona una Zona en el selector, el ID se inserta automáticamente en la expresión.

#### ¿Puedo almacenar una verificación de Zona en un atributo?

Sí. Las cuatro funciones funcionan tanto en una fórmula de atributo como en una condición de enrutamiento. `geofenceName()` es la opción natural, porque le proporciona texto legible. Las otras tres le dan un valor de sí o no, o un valor vacío cuando la posición es desconocida. Un valor de sí o no suele ser más útil para el enrutamiento que para el almacenamiento.

El selector de Zona aparece solo en el **IF/THEN Lógica** Nodo, así que en una fórmula de atributo usted escribe la función y el ID de la Zona por su cuenta.

#### ¿Por qué no puedo guardar un flujo que usa geofenceName?

`geofenceName()` es una opción de pago y está desactivada de forma predeterminada. Póngase en contacto con su proveedor de servicios para que la habilite para su cuenta. Consulte [Antes de empezar](#before-you-start).

#### ¿Qué sucede si se elimina la zona referenciada?

Si una zona referenciada en una expresión se elimina de su cuenta de Navixy, la función ya no puede responder y devuelve un valor vacío. En un **IF/THEN Lógica** nodo que utiliza la función por sí solo, el flujo de datos pasa por la conexión ELSE. El nodo almacena su propio atributo como un valor vacío, no como `falso`. En una condición que combina la función con otros términos, el valor vacío puede detener toda la condición. En un **Iniciar atributo** Nodo el atributo no tiene ningún valor para ese paquete. Consulte [Valores faltantes en expresiones](/docs/user/es/guide/account/iot-logic/nodes/missing-values-in-expressions.md).

El flujo sigue ejecutándose, pero ya no puede guardarlo hasta que corrija la expresión. Volver a guardarlo falla con `Nodo "<node title>" (#<node id>) contiene geozonas inexistentes o inaccesibles`. Actualice o elimine la expresión para restaurar tanto el enrutamiento como la posibilidad de guardar.

#### ¿inGeofence evalúa la posición GPS actual del dispositivo?

Sí. `inGeofence()` comprueba la posición informada en el paquete de datos actual contra los límites de la zona. Cada paquete se evalúa de manera independiente, por lo que el resultado refleja la posición del dispositivo en el momento en que se recibió ese paquete. Un paquete que no contiene posición obtiene un valor vacío en lugar de `true` o `falso`.

#### ¿Cuál es la diferencia entre inGeofence y enterGeofence?

`inGeofence()` devuelve `true` para cada paquete que informa una posición dentro de la zona. `enterGeofence()` devuelve `true` solo para el paquete que registra el momento en que el dispositivo cruzó hacia la zona. Use `inGeofence` cuando necesite aplicar lógica a todos los datos provenientes del interior del área. Use `enterGeofence` cuando necesite reaccionar específicamente al evento de cruzar el límite.

#### ¿Por qué mi atributo geofenceName siempre está vacío?

Revise estas causas en orden:

1. La opción no está activada para su cuenta. Un flujo guardado anteriormente sigue ejecutándose y la función devuelve un valor vacío para cada paquete. Consulte [Antes de empezar](#before-you-start).
2. La Etiqueta que envió no está asignada a ninguna Zona. Los nombres de las Etiquetas deben coincidir con una Etiqueta que exista en su cuenta.
3. El dispositivo realmente está fuera de todas las Zonas que buscó.
4. Tiene una cantidad muy grande de Zonas y la fórmula no pasa ninguna Etiqueta. Pase una Etiqueta para buscar un conjunto más pequeño. El umbral exacto está en [Función del nombre de la zona](/docs/iot-logic-api/technical-details/geofence-name.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://navixy.com/docs/user/es/guide/account/iot-logic/nodes/geofence-functions.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
