> 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 zonas

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

Las funciones de zona permiten que un flujo reaccione según dónde está 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 usted quiere                                                                                           | Use                                                                                                               |
| --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Actuar sobre una zona particular, cuando un dispositivo está dentro de ella, entra en ella o sale de ella | `inGeofence()`, `enterGeofence()`, `leaveGeofence()`. Consulte [Reaccionar a una zona](#reacting-to-one-geofence) |
| Averiguar 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, vendida por separado.** Está desactivada por defecto para cada cuenta, y su proveedor de servicios la habilita por cuenta a solicitud. Las otras tres funciones no se ven afectadas y no necesitan ninguna opción adicional.

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

## Reaccionar a una zona

Use estas tres funciones cuando ya sepa qué zona es relevante. 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á ahora dentro de la zona                 |
| `enterGeofence(id)` | El dispositivo acaba de cruzar hacia el interior de la zona |
| `leaveGeofence(id)` | El dispositivo acaba de cruzar hacia fuera de la zona       |

Las agrega a la condición de un **IF/THEN Lógica** Nodo `id` es el ID numérico de la zona en su cuenta de Navixy, y un selector lo completa por usted, así que rara vez lo escribe a mano. Consulte [Cómo añadir 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 lleva coordenadas. Una posición de baja calidad sigue siendo evaluada, así que una señal GPS débil devuelve un sí o no real.
* La zona se eliminó de su cuenta de Navixy, o quedó inaccesible, después de guardar el flujo. Si una zona ya falta cuando guarda el flujo, en cambio se rechaza al guardar.

Un valor vacío detiene la condición de la que forma parte. Cuando la función es la condición completa, los datos van por la ruta ELSE. Ese enrutamiento suele ser lo 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 /* Almacén de Austin */) == true || leaveGeofence(85269 /* Sitio de construcción 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 un comentario para facilitar la lectura, pero no afecta la evaluación.

```jexl
inGeofence(35229 /* Zona de entrega #4 */)
enterGeofence(51577 /* Almacén de Austin */)
leaveGeofence(85269 /* Sitio de construcción 1 */)
```

{% endtab %}

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

```jexl
inGeofence(35229 /* Zona de entrega #4 */, 1)
inGeofence(35229 /* Zona de entrega #4 */, 1, 'valid')
inGeofence(35229 /* Zona de entrega #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 índice que elegir. Un flujo que pasa un segundo parámetro a cualquiera de las dos funciones no puede guardarse, y el error nombra 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()` obtener 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 añadir 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 dedicado de zonas <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 [autocompletado de atributos](/docs/user/es/guide/account/iot-logic/nodes/initiate-attribute-node/managing-attributes.md#autofill-attribute-names). Lista 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 sobre él en el lienzo.
{% endstep %}

{% step %}

#### Abra el selector de zonas

En el **expresión de condición (JEXL)** campo, haga clic en el icono del selector de zonas 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ó de fuera de la zona seleccionada a su interior.
* `leaveGeofence` - úsela cuando necesite detectar que un dispositivo pasó del interior de la zona seleccionada al exterior.

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

{% step %}

#### Combinar 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 zonas 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íbala usted mismo en el campo.

### Ejemplos de condiciones

<details>

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

Ruta de datos según si un dispositivo se encuentra actualmente dentro de una zona de entrega:

```jexl
inGeofence(35229 /* Zona de entrega #4 */)
```

* **Ruta THEN**: Los datos de dispositivos dentro de la zona fluyen aquí. Use esta rama para activar el procesamiento específico de la zona, como ajustar los umbrales de velocidad o iniciar un atributo de temporizador de permanencia.
* **Ruta ELSE**: Los datos de dispositivos fuera de la zona fluyen aquí para el 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 THEN**: Conéctelo a un **Webhook** nodo para notificar a la seguridad del sitio, o a un **Acción del dispositivo** nodo para registrar el evento de entrada.
* **Ruta ELSE**: Continúe el procesamiento normal de los dispositivos que no ingresan al sitio.

</details>

<details>

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

Detecte cuando un vehículo salga de un área de servicio autorizada durante el horario laboral:

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

* **Ruta THEN**: Envíe una alerta a través de un **Webhook** nodo a un sistema de despacho.
* **Ruta ELSE**: 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 donde una de ellas no puede 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 demás zonas nunca se prueban. Consulte [Cuando una función de zona no da respuesta](#when-a-geofence-function-gives-no-answer).

* **Ruta THEN**: Aplique reglas o notificaciones específicas de la zona.
* **Ruta ELSE**: 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 THEN**: Registre una violación de velocidad acotada a esa zona, o envíe una alerta dirigida.
* **Ruta ELSE**: Continúe con el procesamiento estándar para los datos conformes o fuera de la zona.

</details>

<details>

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

Detecte una transición de fuera hacia 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 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 cual no produce ningún resultado cuando no hay una posición anterior que probar.

</details>

## Registrar la zona actual

`geofenceName()` le indica en qué zona está 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, y no edita el flujo cada vez que agrega una zona. Esto es lo que contiene el atributo para un vehículo de reparto que reporta durante el 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 ahí 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 comenzar

**La opción debe estar activada 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 habilite, no se puede 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 zonas para buscar.**

* Hay al menos una zona en su cuenta. Consulte [Zonas](/docs/user/es/guide/tracking/map-tools/geofences.md).
* Para buscar solo una parte de sus zonas, etiquételas. Consulte [Usar 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 manera 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 a continuación en el **Fórmula** campo.

Escriba usted mismo el nombre de la función. El atributo de autocompletado no ofrece `geofenceName`, y el selector de zonas 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 `depósitos` en la que el dispositivo se encuentra actualmente |
| `geofenceName('', 1, 'valid')` | El nombre de cualquier Zona en la que estuvo el dispositivo en el paquete de datos anterior    |

Los tres parámetros son opcionales:

* **La etiqueta**La etiqueta, en primer lugar, limita la búsqueda a las Zonas que usted etiquetó con ese nombre. No importa si está en mayúsculas o minúsculas, y una etiqueta vacía significa todas las Zonas. Etiquetar es importante cuando usted tiene muchas Zonas y solo algunas son significativas para este atributo, por ejemplo depósitos, pero no sitios de clientes.
* **El número de paquete**, en segundo lugar, indica hasta dónde mirar hacia atrás: `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**, el tercero, es `'válido'` para omitir los paquetes que no contenían posición, o `'todos'` para contarlos. Omítalo y los paquetes sin posición se contarán.

Para conocer los límites exactos de cada parámetro, consulte [función de nombre de 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 devolver. 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 usted 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 de abajo lo comprueba.

Para obtener texto legible en lugar de un vacío, agregue un valor de respaldo con el `?:` operador:

```jexl
geofenceName() ?: 'Outside all geofences'
```

Cuando una posición cae dentro de dos zonas superpuestas, la función devuelve uno de los dos nombres. Navixy no prioriza 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 `depósitos`, luego cree un atributo con esta fórmula:

```jexl
geofenceName('depots') ?: 'In transit'
```

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 ninguna `depósitos` etiqueta.

</details>

<details>

<summary>Enrutamiento por área en un nodo de 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 datos registrados dentro de cualquier zona etiquetada `restricted` por la rama THEN, use esta condición:

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

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

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

</details>

<details>

<summary>Detectar un cambio de zona</summary>

Para activarse 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 de un cambio que no ocurrió.

</details>

## Preguntas frecuentes

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

El selector de zonas 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 comprobació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 se desconoce. Un valor de sí o no suele ser más útil para el enrutamiento que para el almacenamiento.

El selector de zonas solo aparece en el **IF/THEN Lógica** nodo, por lo que en una fórmula de atributo usted escribe la función y el ID de la zona.

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

`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 en su cuenta. Consulte [Antes de comenzar](#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 usa la función por sí solo, los datos fluyen 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 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 capacidad 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 frente a los límites de la Zona. Cada paquete se evalúa de forma 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 geocerca. `enterGeofence()` Devuelve `true` solo para el paquete que registra el momento en que el dispositivo entró en la Zona. Use `inGeofence` cuando necesite aplicar lógica a todos los datos desde dentro del área. Use `enterGeofence` cuando necesite reaccionar específicamente al evento de cruzar el límite.

#### ¿Por qué el 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. Vea [Antes de comenzar](#before-you-start).
2. La etiqueta que proporcionó 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 de nombre de 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.
