Skip to content

Add MQTT telemetry with Core 0 execution to avoid mining disruption#29

Open
Copilot wants to merge 3 commits intodevelopfrom
copilot/implement-mqtt-integration
Open

Add MQTT telemetry with Core 0 execution to avoid mining disruption#29
Copilot wants to merge 3 commits intodevelopfrom
copilot/implement-mqtt-integration

Conversation

Copy link
Contributor

Copilot AI commented Oct 30, 2025

Implements MQTT client for real-time mining telemetry as requested in #[issue_number]. MQTT operations run on Core 0 (secondary processor) while SHA256 mining remains on Core 1.

Changes

New modules:

  • mqtt_handler.{c,h} - MQTT client wrapper with non-blocking publish API
    • Publishes hashrate, total hashes, best difficulty to separate topics
    • Connects to configurable broker (defaults to public EMQX at broker.emqx.io)
    • Auto-reconnect and error handling

Configuration:

  • Added MQTT settings to config.h.example with ENABLE_MQTT flag
  • Default broker: mqtt://broker.emqx.io:1883
  • Topics: btc_miner/{hashrate,total_hashes,best_difficulty,status}

Integration:

  • mqtt_handler_init() called from wifi_init() after network setup
  • mqtt_publish_mining_stats() called every 2s from mining task update loop
  • Both wrapped in #if defined(WIFI_SSID) && ENABLE_MQTT for CI/CD compatibility

Documentation:

  • Added MQTT section to README with topic descriptions
  • Included MQTTX AIO Toolbox reference for monitoring as requested

Example Usage

// In config.h - optional customization
#define MQTT_BROKER_URL "mqtt://your-broker:1883"
#define MQTT_CLIENT_ID "esp32_miner_01"
#define ENABLE_MQTT 1

Subscribe to btc_miner/# in MQTTX to see real-time mining stats.

Technical Notes

  • Uses PRIu64/PRIu32 macros for portable integer formatting
  • MQTT component always linked but functions only invoked when enabled
  • No performance impact on mining: MQTT runs async on separate core
Original prompt

This section details on the original issue you should resolve

<issue_title>Implement MQTT</issue_title>
<issue_description>References:

<agent_instructions>MQTT should be used via secondary processor, to not disrupt sha256 decode. Also, add a note to implement MQTTX AIO Toolbox.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI and others added 2 commits October 30, 2025 21:36
Co-authored-by: v-Kaefer <128633407+v-Kaefer@users.noreply.github.com>
Co-authored-by: v-Kaefer <128633407+v-Kaefer@users.noreply.github.com>
Copilot AI changed the title [WIP] Implement MQTT via secondary processor Add MQTT telemetry with Core 0 execution to avoid mining disruption Oct 30, 2025
Copilot AI requested a review from v-Kaefer October 30, 2025 21:42
@github-actions
Copy link

Test Coverage Analysis

Changed Files:

main/main.c
main/mqtt_handler.c
main/mqtt_handler.h

Functions Found in Changed Files:

main/main.c

61:void wifi_init(void)
111:esp_err_t i2c_master_init(void)
131:void double_sha256(const uint8_t* data, size_t len, uint8_t* hash)
154:uint32_t count_leading_zeros(const uint8_t* hash)
173:void init_block_header(void)
200:void update_display(float hashrate)
229:void mining_task(void *pvParameters)
311:static esp_err_t i2c_init_on_pins(int sda, int scl) {
329:static void i2c_deinit(void) {
333:static int i2c_scan_addrs_log(void) {
350:static void i2c_pin_sweep(void) {
386:static esp_err_t i2c_probe_addr(i2c_port_t port, uint8_t addr, TickType_t timeout_ms)
398:static esp_err_t probe_once(int sda, int scl, int addr) {
416:static esp_err_t try_pair(int sda, int scl)
465:static void i2c_init_fixed(void)
484:void app_main(void)

main/mqtt_handler.c

15:static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
69:esp_err_t mqtt_handler_init(void)
113:esp_err_t mqtt_publish_mining_stats(float hashrate, uint64_t total_hashes, uint32_t best_difficulty)
150:esp_err_t mqtt_publish_status(const char *status)
167:bool mqtt_is_connected(void)
172:void mqtt_handler_stop(void)

main/mqtt_handler.h

29:esp_err_t mqtt_handler_init(void);
39:esp_err_t mqtt_publish_mining_stats(float hashrate, uint64_t total_hashes, uint32_t best_difficulty);
47:esp_err_t mqtt_publish_status(const char *status);
54:bool mqtt_is_connected(void);
59:void mqtt_handler_stop(void);

Test Coverage Status:

⚠️ No test directory found. Consider adding unit tests for new features.

Recommendation: Create a test directory and add unit tests for:

  • Mining functions (double_sha256, count_leading_zeros)
  • Block header initialization
  • WiFi and I2C initialization functions

1 similar comment
@github-actions
Copy link

Test Coverage Analysis

Changed Files:

main/main.c
main/mqtt_handler.c
main/mqtt_handler.h

Functions Found in Changed Files:

main/main.c

61:void wifi_init(void)
111:esp_err_t i2c_master_init(void)
131:void double_sha256(const uint8_t* data, size_t len, uint8_t* hash)
154:uint32_t count_leading_zeros(const uint8_t* hash)
173:void init_block_header(void)
200:void update_display(float hashrate)
229:void mining_task(void *pvParameters)
311:static esp_err_t i2c_init_on_pins(int sda, int scl) {
329:static void i2c_deinit(void) {
333:static int i2c_scan_addrs_log(void) {
350:static void i2c_pin_sweep(void) {
386:static esp_err_t i2c_probe_addr(i2c_port_t port, uint8_t addr, TickType_t timeout_ms)
398:static esp_err_t probe_once(int sda, int scl, int addr) {
416:static esp_err_t try_pair(int sda, int scl)
465:static void i2c_init_fixed(void)
484:void app_main(void)

main/mqtt_handler.c

15:static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
69:esp_err_t mqtt_handler_init(void)
113:esp_err_t mqtt_publish_mining_stats(float hashrate, uint64_t total_hashes, uint32_t best_difficulty)
150:esp_err_t mqtt_publish_status(const char *status)
167:bool mqtt_is_connected(void)
172:void mqtt_handler_stop(void)

main/mqtt_handler.h

29:esp_err_t mqtt_handler_init(void);
39:esp_err_t mqtt_publish_mining_stats(float hashrate, uint64_t total_hashes, uint32_t best_difficulty);
47:esp_err_t mqtt_publish_status(const char *status);
54:bool mqtt_is_connected(void);
59:void mqtt_handler_stop(void);

Test Coverage Status:

⚠️ No test directory found. Consider adding unit tests for new features.

Recommendation: Create a test directory and add unit tests for:

  • Mining functions (double_sha256, count_leading_zeros)
  • Block header initialization
  • WiFi and I2C initialization functions

@github-actions github-actions bot added 🤖 copilot GitHub Copilot assisted changes 🔧 firmware ESP32 firmware and ESP-IDF changes 📝 documentation Improvements or additions to documentation 🔬 alpha Alpha version - development branch labels Oct 30, 2025
@v-Kaefer v-Kaefer marked this pull request as ready for review October 30, 2025 21:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔬 alpha Alpha version - development branch 🤖 copilot GitHub Copilot assisted changes 📝 documentation Improvements or additions to documentation 🔧 firmware ESP32 firmware and ESP-IDF changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants