Novedad: el cortafuegos de IA supervisa toda la plataforma y explica cada incidente con palabras sencillas. Vea cómo funciona

Eric Lewis

lewisfw

@lewis-e · Se unió el marzo 2026

Recién llegado

Embedded developer · energy · 14 years in the field

Temas
1
Respuestas
37
Puntos
0
Recién llegado10 puntos para Miembro

Respuestas de foro creadas

Viendo 15 entradas – de la 16 a la 30 (de un total de 37)

Traducido del English por IA ·

La mayor parte se debe al volumen. Los chips Wi-Fi se envían por miles de millones, mientras que los Zigbee solo son una fracción de eso.

Timestamps in UTC or it didn't happen.
♥ 2

Traducido del English por IA ·

En la parte de radio tiene algo de razón. Contiki-NG sí tiene multicast IPv6 para redes RPL: dos motores, SMRF y MPL. Se activa en tiempo de compilación en el project-conf.h de los nodos y en el del border router:

/* every node and the border router */
#define UIP_MCAST6_CONF_ENGINE UIP_MCAST6_ENGINE_MPL
/* for SMRF instead you also need storing mode with multicast: */
/* #define UIP_MCAST6_CONF_ENGINE UIP_MCAST6_ENGINE_SMRF */
/* #define RPL_CONF_MOP RPL_MOP_STORING_MULTICAST */

Donde tiene razón es en que el rpl-border-router estándar no reenvía a la malla el multicast que llega desde la red externa. Por eso el multicast tiene que originarse en el propio border router: un pequeño proceso en esa máquina que, al recibir una orden de Hermetry, envía un datagrama MPL a un grupo al que se han unido los nodos. Esto implica volver a flashear los 30 nodos con multicast habilitado, lo que en una instalación de almacén frigorífico significa una visita a la planta.Sinceramente, para 30 nodos yo descartaría el multicast. Que el border router recorra las 30 direcciones y envíe unicast con reintentos. 30 paquetes pequeños en una malla no son nada, termina en segundos, y cada nodo confirma, así que sabes quién no lo recibió. Sin reflasheo.Luego, en Hermetry: añade un comando como sampling.set con un parámetro period_s en el perfil de la pasarela, respóndelo desde ese proceso cuando todos los nodos hayan confirmado, y pon dos botones en el panel de QA. Haz que los nodos informen su periodo actual como atributo de cliente para que QA pueda ver que se aplicó.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 8

Traducido del English por IA ·

¿Una vez cada 5 minutos desde un solo equipo? No. Y las lecturas no cuentan para la cuota de mensajes, que corresponde a la telemetría y los atributos que envían los dispositivos.

Timestamps in UTC or it didn't happen.
♥ 2

Traducido del English por IA ·

Ese no es tu topic. Hermetry solo permite que un dispositivo se suscriba a sus propios topics de downlink: v1/attributes/set, v1/attributes/res/+, v1/rpc/req/+, v1/rpc/up/res/+ y v1/cert (además de los topics gw para gateways). Un dispositivo nunca recibe mensajes de otro dispositivo y nunca ve sus propios uplinks. La tabla está en MQTT topics and payload reference. A mí también me pasó en mi primer proyecto.
Para el punto 1 no necesitas ningún eco. El PUBACK es la confirmación: Hermetry solo lo envía cuando el mensaje está encolado de forma segura, y en el orden en que publicaste. Mantén la lectura en tu buffer hasta que llegue su PUBACK y bórrala entonces. Si la sesión se cae antes, vuelve a enviarla tras reconectar; los duplicados con la misma clave y marca de tiempo se almacenan una sola vez de todos modos.
Para el punto 2, la pantalla no debería escuchar MQTT en absoluto. Dale una clave de API y que lea el último valor por REST cada pocos minutos:

GET https://<your host>/tenant/<tenantId>/api/telemetry/latest?kind=iot_device&entityId=<cabinet3 id>&keys=kwh
Authorization: Bearer sk_live_...

Haz que la clave sea solo de lectura (basta con el permiso de lectura de telemetría), pon la dirección pública del depósito en la lista de IP permitidas de la clave y ten en cuenta la caducidad: 90 días por defecto, un año como máximo, así que añade un recordatorio para la rotación. Después puedes eliminar también el dispositivo de la pantalla, no lo necesita.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 1

Traducido del English por IA ·

Tuve exactamente esta situación con placas de contadores que instaló un contratista. Puedes preguntarle al firmware que está corriendo: la API de particiones de ESP-IDF funciona bien desde el core de Arduino. Sube un build a las placas a las que puedas acceder (las de tu propio lote), o espera a que las demás estén en el depósito; reportará la tabla como atributos de cliente una vez después de conectarse:

#include "esp_partition.h"

void reportPartitions() {
  String json = "{";
  esp_partition_iterator_t it =
      esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
  bool first = true;
  while (it != NULL) {
    const esp_partition_t *p = esp_partition_get(it);
    if (!first) json += ",";
    json += ""part." + String(p->label) + "":"" +
            String(p->address, HEX) + "/" + String(p->size) + """;
    first = false;
    it = esp_partition_next(it);
  }
  esp_partition_iterator_release(it);
  json += "}";
  mqtt.publish("v1/attributes", json.c_str());
}

Luego, en la pestaña Attributes, ámbito Client, verás part.app0, part.app1, part.otadata y demás por placa. Lo que quieres ver son dos slots de aplicación (ota_0 y ota_1, llamados app0/app1 en las tablas de Arduino) más otadata, cada uno al menos tan grande como tu imagen. Si ves un solo app0 de 3 MB y ningún app1, es el esquema «Huge APP», no es posible OTA.Para las placas a las que no puedes enviar un build nuevo, el método de emily funciona en el depósito:

esptool.py --port /dev/ttyUSB0 read_flash 0x8000 0xc00 pt.bin
python gen_esp32part.py pt.bin

Las placas con el esquema equivocado necesitan un reflasheo único por USB con una tabla de dos slots. Después, OTA funciona para siempre.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 1

That’s a counterbalance valve (CBV = counterbalance valve). The check valve lets oil flow freely into the cylinder to lift. Coming down, oil has to push past a relief spring, and the dashed pilot line from the other side helps open it, so the load can’t run away or drop if a hose fails. The arrow across the spring means the setting is adjustable. On a lift table it’s the part that stops the platform falling, so it’s worth showing clearly.

On the drawing: the core symbol set has a check valve in the water network family, it’s in every organisation with the SCADA module. I’d place that, label it «CBV-1 counterbalance» with a text, and you’re honest about what it is. The palette search matches names and common other names, so search «check» rather than the part number.

If you want a proper hydraulic/process valve symbol, the Process library covers pumps and valves and ISA instruments. You can browse it before buying: symbols of a locked library show in the palette with a padlock and a still picture. Just see whether one fits before paying. Details: Symbols and industry packs.

Worth putting your pressure transmitter between the CBV and the cylinder on the drawing too, that’s where a dropping load would show first.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 9

Owen has it. The press is shorter than your loop, so polling misses it. Use an interrupt so the count happens the moment the pin falls, and do the debounce by time inside it. I’ve had pulse counters on gas meters for years done like this:

volatile uint32_t rejects = 0;          // since boot
volatile uint32_t lastEdgeUs = 0;

void IRAM_ATTR onPress() {
  uint32_t now = micros();
  if (now - lastEdgeUs > 30000) {       // ignore bounce within 30 ms
    rejects++;
  }
  lastEdgeUs = now;
}

void setup() {
  pinMode(D5, INPUT_PULLUP);           // button to GND
  attachInterrupt(digitalPinToInterrupt(D5), onPress, FALLING);
}

Remove the delay(50) from loop(). In the publish, copy the counter with interrupts briefly off.

Hardware: on a factory floor the button cable is often metres long next to motor cables. Add a 1 kΩ series resistor and 100 nF at the ESP pin, or better, run the button at 24 V into an optocoupler. Otherwise you’ll start counting phantom rejects.

Send a cumulative counter, not «rejects this minute»: {"rejects.total": 1532}. If a message is lost, the next one still has the right total, and a chart with the increase aggregate gives you rejects per hour.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 9

Kevin’s right that HC-12 is the easy way. With bare modules, the piece most people miss is that the Si446x chips don’t have a register map you just poke. You load a configuration blob that Silicon Labs’ WDS tool generates (radio_config.h) for your frequency, modulation and data rate, and send it to the chip at startup.

The library that works for me is RadioHead, driver RH_RF24, which supports Si4460/4461/4463. It ships with a set of ready configurations, so you don’t need WDS unless you want something unusual. Minimal sender:

#include <SPI.h>
#include <RH_RF24.h>
RH_RF24 rf24(10, 2, 9);   // CS, nIRQ, SDN
void setup() {
  Serial.begin(9600);
  if (!rf24.init()) Serial.println("init failed");
  rf24.setFrequency(433.92);
  rf24.setTxPower(0x4f);
}
void loop() {
  uint8_t msg[] = "lvl=182";
  rf24.send(msg, sizeof(msg));
  rf24.waitPacketSent();
  delay(60000);
}

Two traps. SDN is active high, so if you leave it floating the chip sits in shutdown and init fails. And these modules run at 3.3V: a 5V Pro Mini needs level shifting on SPI, or use the 3.3V/8 MHz Pro Mini, which is also better for battery life.

On the Pi end, read the packet and publish lvl as a key the same way you do for your other devices.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 3

Makes sense. Measured it: GND2 to GND2 drifted around 0.6 V on the bench, so plenty of margin there and none to count on outdoors. Ordered cable with an extra pair, reference through 100 ohm at each end, shield earthed at the gateway end. Thanks Ciaran, and Tyler for the supply capacitance hint.

Timestamps in UTC or it didn't happen.
♥ 1

Traducido del English por IA ·

Megan tiene razón. Lo que haría:1. Sigue enviando co2, temperature y motion como números (motion como 0/1, no true/false, para que tenga un historial).2. Extrae los datos sin procesar con la API de historial; un día por llamada es cómodo:

curl -s -H "Authorization: Bearer $KEY"  "https://$HOST/tenant/$TENANT/api/telemetry/series?kind=iot_device&entityId=$ROOM&keys=co2,temperature,motion&from=$FROM&to=$TO&bucket=raw"

Si una clave devuelve 10.000 puntos, vuelve a pedir desde el último ts + 1.3. Únelo con la exportación de recepción en un portátil y entrena una regresión logística o una red de 3 entradas y 8 neuronas en Python. Eso basta de sobra para la pendiente de CO2 + el recuento de movimiento.4. Cuantiza los pesos a int8, pégalos como un array const int8_t w[] PROGMEM y el Uno solo ejecuta el forward pass. Envía el resultado como occupied_p (0-100) junto con las otras claves.Sinceramente, para la ocupación, el aumento de CO2 en 20 minutos más «cualquier movimiento en los últimos 30 min» te lleva ya bastante lejos antes de cualquier red neuronal. Empieza con eso como línea base para saber si el modelo merece la pena. El lado de la API está aquí: La API de historial.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 9

Megan’s right. The Personnel tracking page calls Hermetry Safe the dedicated worker-safety product but doesn’t say what it does, so I wouldn’t promise anything from it. The Personnel tracking ready solution is what I’d use, and room-level is exactly what it’s built for. I set it up for a pumping station last year.

The way zones work decides your hardware. Hermetry does not work out zones from positions or radio signals, and it has no geofence polygons. The tracker, or the gateway that hears it, decides which zone the person is in and sends the zone name in the key zone. So the zone logic lives in your hardware: a small BLE transmitter fixed in each room, the worker’s tracker reports the strongest one it hears, and the tracker or the gateway maps that to a zone name like switchgear-2.

The solution’s tracker profile then gives you the rest:

keys:   lat, lng, zone, event, battery, air_temp, light
event:  normal | motion | fall | motionless | sos | press_once
alarms: fall, motionless, sos (Critical), help_call,
        forbidden_zone (zone == the tracker's forbiddenZone attribute),
        battery_low, device_offline (15 min)

The event words must be exactly those, lower case. If your tracker sends something like FALL, translate it in the profile’s root flow. Each tracker gets a server attribute forbiddenZone with one room name, so set it to the switchgear room for everyone without a permit. Only one forbidden zone per tracker out of the box, a second needs an extra rule.

For the map, use the Map card in image mode with the building’s floor plan, positions in pixels. Full description: Personnel tracking.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 8

Traducido del English por IA ·

Sí, oculta el destino ante alguien que observe la línea del depósito, Rahul. Pero el destino nunca fue el secreto, y Tor te cuesta cosas reales en el lado de Hermetry.Lo que realmente te protege hoy: la sesión MQTT usa TLS 1.2 como mínimo con suites de secreto hacia adelante, así que el contenido y el token del dispositivo no son legibles en la red. Alguien que capture el enlace ascendente del depósito solo sabe que hay un dispositivo hablando con un broker cada N segundos. Tor oculta el nombre del broker, pero añade mucha latencia y rotación de conexiones.Ahora los costes. Cada circuito de Tor sale por una dirección distinta. Hermetry envía a tus administradores un aviso cuando un dispositivo inicia sesión desde una red nueva (como máximo una vez por hora y dispositivo), así que 9 nodos saltando entre salidas generan un flujo constante de esos avisos, y acabas entrenando a la gente para ignorar justo la advertencia que les diría que un token fue robado. Además, pierdes la opción de Redes permitidas del perfil, uno de los mejores controles para dispositivos de ubicación fija: si incluyes la dirección pública del depósito, un token robado usado desde cualquier otro lugar recibe CONNACK 5. Y los inicios de sesión fallidos repetidos bloquean una dirección para todos los dispositivos detrás de ella, algo que en salidas compartidas no controlas.Si el jefe quiere más, haría esto en su lugar, todo en el perfil del dispositivo:

  • Redes permitidas: la IP pública del depósito
  • Solo TLS, Token en la URL desactivado, Comandos permitidos sin TLS vacío
  • pasar de tokens de acceso a X.509 si tu firmware lo permite; si no, MQTT basic, una credencial por dispositivo
  • bajar los Límites del perfil a lo que los nodos realmente envían, para que uno secuestrado se corte rápido

Y pon los ESP32 en su propia VLAN para que un nodo comprometido no pueda llegar a los PC de la oficina. La lista de verificación está en Device transport security.

Timestamps in UTC or it didn't happen.
Solución aceptada♥ 9
Viendo 15 entradas – de la 16 a la 30 (de un total de 37)