Skip to content

poweroff/shutdown are silently accepted but do nothing on Heltec T114 (v1.16.0), while pwrmgt.support reports supported #3071

Open

Description

@hleserg

Summary

On Heltec T114 running official firmware v1.16.0, the poweroff and shutdown CLI commands are parsed and accepted, but the device never powers off. It keeps responding to commands immediately afterwards. This happens over both remote admin (LoRa) and direct USB serial, and on both Repeater and Room Server roles.

get pwrmgt.support returns supported on the same devices, so the reported capability does not match actual behaviour.

Environment

  • Board: Heltec T114 (board → Heltec T114)
  • Firmware: v1.16.0-07a3ca9 (Build: 06-Jun-2026), official release
  • Roles tested: Repeater and Room Server (separate devices, same result)
  • Power source: get pwrmgt.source → battery
  • Devices tested: 3× T114

Steps to reproduce

Over USB serial (meshcli -r -s COM8), which rules out radio/remote-admin delivery:

Beta-0.1 Repeater> get pwrmgt.support
  -> > supported
Beta-0.1 Repeater> poweroff
  ->
Beta-0.1 Repeater> ver
  -> v1.16.0-07a3ca9 (Build: 06-Jun-2026)
Beta-0.1 Repeater> shutdown
  ->
Beta-0.1 Repeater> ver
  -> v1.16.0-07a3ca9 (Build: 06-Jun-2026)

Over remote admin from the Android app, same result:

> board
Heltec T114
> get pwrmgt.support
> supported
> get pwrmgt.source
> battery
> get pwrmgt.bootreason
> Reset: Soft Reset; Shutdown: Unknown
> poweroff
> get pwrmgt.bootreason
> Reset: Soft Reset; Shutdown: Unknown
> shutdown
> get pwrmgt.bootreason
> Reset: Soft Reset; Shutdown: Unknown

Expected

The device enters SYSTEMOFF, stops responding, and on next boot get pwrmgt.bootreason reports shutdown reason USER (0x55).

Actual

Nothing happens. No error, no reply, no power-off. The node answers the very next command. pwrmgt.bootreason is unchanged across the attempts.

Additional observations

  1. The command is recognised, not rejected. power off (with a space) returns Unknown command, while poweroff and shutdown return silence. So the CLI aliases exist; the board-level implementation appears to be missing or a no-op.

  2. Shutdown: Unknown is not a documented value. The nRF52 power management docs list NONE (0x00), LOW_VOLTAGE (0x4C), USER (0x55) and BOOT_PROTECT (0x42). Unknown is none of these, which suggests GPREGRET2 is not being written as designed on this board.

  3. adc.multiplier contradicts pwrmgt.support. On the same device:

    > get pwrmgt.support
    > supported
    > set adc.multiplier 2.0
    Error: unsupported by this board
    

    Battery reporting is also off by ~2.7% (reports 4130 mV, multimeter reads 4019 mV at the battery connector), with no way to correct it.

  4. Possibly related: the EasySkyMesh fork disabled NRF52_POWER_MANAGEMENT for RAK4631, RAK3401, Heltec T114, Xiao nRF52 and SenseCAP Solar in April 2026, which may indicate known instability in this subsystem on these boards.

Suggested outcome

Either implement powerOff() for T114, or have pwrmgt.support report unsupported and make poweroff/shutdown return an explicit error, so operators know before deploying a node somewhere they can't reach.

Impact

For repeaters and room servers mounted out of reach, there is currently no way to power a node down remotely, and no indication that the command has failed. reboot works correctly on the same devices.

Activity

  1. jirogit commented on Aug 4, 2026

    @jirogit
    Contributor

    This matches the root cause fixed in #2701 (still open, not yet merged).

    On both T114 and RAK4631, initiateShutdown(uint8_t reason) is implemented and correctly writes the shutdown reason to GPREGRET2 before entering SYSTEMOFF. However, neither board overrides powerOff() to call it — the CLI's poweroff/shutdown commands fall through to MainBoard::powerOff(), which is a no-op. This is why the command is silently accepted (no "unknown command" error) but nothing happens, and why pwrmgt.bootreason shows Shutdown: Unknown — initiateShutdown() is never actually invoked, so GPREGRET2 is never written.

    #2701 adds the missing powerOff() override on both boards, delegating to initiateShutdown(SHUTDOWN_REASON_USER). Verified on real T114 and RAK4631 hardware (battery-powered, USB disconnected).

    Thank you for catching on the adc.multiplier/pwrmgt.support mismatch — that looks like a separate reporting gap worth its own issue, distinct from the poweroff/shutdown problem here.

  2. github-actions commented on Oct 20, 2026

    @github-actions
    Contributor

    This issue is stale because it has been open for 60 days with no activity. Remove the stale label or add a comment if this issue is still relevant, otherwise this issue will automatically close in 7 days.

  3. jirogit commented on Nov 9, 2026

    @jirogit
    Contributor

    Correction: see my next comment — #2701 is a no-op on current dev.

    Still relevant — the fix is in #2701 (T114 powerOff() → initiateShutdown(SHUTDOWN_REASON_USER)), which merges cleanly against current dev. RAK4631 is now also covered by #3705.

  4. jirogit commented on Nov 9, 2026

    @jirogit
    Contributor

    Update: on current dev / v1.18.0, T114 no longer defines NRF52_POWER_MANAGEMENT (removed in 3984b87, Apr 22), so T114Board::powerOff() falls through to NRF52Board::powerOff(). Since July that path calls shutdownPeripherals() (display off, SX1262 powerOff(), GPS stop) before SYSTEMOFF, so this issue may already be fixed in v1.18.0.

    @hleserg could you try poweroff on v1.18.0 on one of your T114s? I’ll test on mine as well when I’m back with the hardware. Note pwrmgt.bootreason will likely still show Shutdown: Unknown, since the shutdown reason is only written via initiateShutdown(), which is compiled only with NRF52_POWER_MANAGEMENT.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions