ciaran55
@ciaranwalsh55 · Joined June 2025
Smart-city engineer · energy
- Topics
- 9
- Replies
- 68
- Points
- 0
Forum Replies Created
Operator had a fixed-IP APN option, we got a /28. Allowed networks set on the cabinet profile. Tested with a dev board on my home broadband using a real cabinet token: CONNACK 5, and the Log tab shows the refusal reason. Tokens and PSK are in NVS now, flash encryption is next after I brick a spare or two learning it. Missing board’s token revoked.
Allowed networks is the part I didn’t know about. But the cabinet routers get dynamic addresses on cellular, so I don’t have a range to put in.
For the really fine tuning I’d also log the full 200 Hz to an SD card and keep Hermetry for the booth dashboard. Two different jobs.
Don’t push the .bin over MQTT. Hermetry’s OTA tells the device where to download the image over HTTPS and the device does the rest. I did 140 street-cabinet controllers this way last year. The parts:
Hermetry side (an Admin, and an Owner once for the key):
- Profile of the room sensors, Firmware tab: turn on “Allow firmware updates for this profile”. Leave unsigned images off.
- Firmware > Signing keys: the Owner adds your Ed25519 public key. You sign each .bin on your laptop and upload the .sig with it. Hermetry never holds the private key.
- Upload firmware: Name must equal what the board reports as its firmware title, e.g.
room-sensor, Version e.g.2.1.0. - Assign it, first to One device (the one in your office), later to the whole profile.
Device side, once by ladder, after that never again. The board gets these shared attributes on v1/attributes/set:
{"fw_title":"room-sensor","fw_version":"2.1.0","fw_size":1183744,
"fw_checksum":"9c1e...","fw_checksum_algorithm":"SHA256",
"fw_url":"https://...","fw_sig":"..."}
Your code then: report fw_state DOWNLOADING with fw_progress, download fw_url with HTTPClient into the OTA partition using Update.h, check SHA-256 and the signature, report VERIFIED, then UPDATING, reboot. After the reboot publish current_fw_title and current_fw_version. Hermetry only marks it Updated when that new version shows up. If anything fails, report FAILED with fw_error and stay on the old image.
Gotchas: fw_url is valid 15 minutes, so if a download stalls, ask for fw_url again on v1/attributes/req/1 and resume with an HTTP Range request. And firmware is never offered over plain MQTT, so the boards need to be on TLS.
Full page: Firmware updates (OTA)
Blocks on rows 1 and 3 with contrast fine means the display powered up but never got initialised, so it’s sitting in its one-line power-on mode. Almost always the I2C address. Backpacks with a PCF8574A chip are at 0x3F, not 0x27, and from the outside they look identical. Run a scanner:
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
for (uint8_t a = 1; a < 127; a++) {
Wire.beginTransmission(a);
if (Wire.endTransmission() == 0) Serial.printf("found 0x%02Xn", a);
}
}
void loop() {}
Second thing for an ESP32: the backpack on 5V has its pull-ups to 5V, so SDA/SCL idle at 5V into a 3.3V chip. It usually works and it’s not great. Either power the backpack from 3.3V (some LCDs go faint at 3.3V) or remove the backpack’s pull-up resistors and add 4.7k to 3.3V, or put a small level shifter in between. For something on a cleanroom wall for years I’d do the level shifter.
Sorted, thanks Eric. Ripped out the echo subscribe, the cabinet now waits for the PUBACK before dropping the buffered reading. The display does the GET every 5 min. The first call got refused and I panicked a bit, turned out I’d made the key under my own login on the test organisation, so the tenant id in the path didn’t match the key. Made a fresh one on the right organisation and it came straight up.
Antenna on the roof with a 1 m cable and the RC filter on the input. Two days, not one spike, even with the tech calling from right beside it. The high-level alarm had fired 11 times last month on these, which nobody had linked to the router.
Same pattern works for water meters. increase saved us when a meter was swapped mid-month and the new one started at 0.
How long are the outages usually? Minutes or hours?
What does date say on the Pi when you’re in the lab?
Tyler has part of it. Each receiver input also has its own resistance to that side’s GND2 (the input impedance, around 96k for a 1/8 unit load device, more or less), and the bias network ties A and B toward one side’s isolated supply and ground. Each isolated side is floating, so it settles wherever those resistances and the leakage across the isolation barrier put it. The two GND2s drift toward each other through the bus wires themselves. On a 2 m bench with nothing injecting current, that’s close enough, so it works.
Over 300 m between buildings you get induced common-mode voltages and lightning transients. With nothing defining the common mode, one side can sit far outside the receiver’s range and the link gets flaky, or the isolation barrier takes surges it doesn’t need to.
Standard practice: run a third conductor as a signal reference, connect it to GND2 at each node through about 100 ohm to limit current if the grounds disagree, and earth the cable shield at one end only. Michael, that’s why you were taught three wires, it’s the right habit. Keep the bias on one end and termination at both ends as you have it.
Ha, small world, I’ve done street lighting for a town like that, on City. No idea if it does parking though, and I never found a doc page for it either.
You can pin it by hand in Device Manager, port properties, Advanced, COM Port Number. But it’s per USB socket, so it comes back the moment someone uses another socket.
Keep the old thermostat set to something like 12 °C as frost protection in parallel, then if the internet or your board is out the building still won’t freeze.
That’s the problem. On the Zero, pin 1 is at the SD card end, but on the inner row. The pin you used, outer row at that corner, is pin 2, which is 5V. Count from there: pin 6 on the outer row is GND, pin 7 is on the inner row. If your red went to pin 2 and the rest followed the tutorial with the board mirrored, the DHT22 probably had 5V or GND on the wrong legs, which is why it got warm.
Ways to be sure next time: the solder pad for pin 1 is square, all the others are round. And on the Pi itself:
$ pinout # comes with gpiozero, prints an ASCII map of your board
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
So: VCC to pin 1 (3V3), DATA to pin 7 (which is GPIO4 in code), GND to pin 6. Use 3V3 for the DHT22, not 5V, so the data line stays at a level the Pi can take.
Whether the sensor survived: DHT22s are tougher than you’d think. Rewire, let it cool, try again. If it still says not found with the correct wiring, it’s dead, they’re cheap.

