--- title: "MQTT" date: 2025-01-27 draft: false description: "a description" tags: ["mqtt", "esp"] --- # MQTT A configured MQTT server will receive statistical and status data from the controller. ### Topics | Topic | Example | Description | |-------|---------|-------------| | `firmware/address` | `192.168.1.2` | IP address in station mode | | `firmware/state` | `VersionInfo { ... }` | Debug information about the current firmware and OTA slots | | `firmware/last_online` | `2025-01-22T08:56:46.664+01:00` | Last time the board was online | | `state` | `online` | Current state of the controller | | `mppt` | `{"current_ma":1200,"voltage_ma":18500}` | MPPT charging metrics | | `battery` | `{"Info":{"voltage_milli_volt":12860,"average_current_milli_ampere":-16,...}}` | Battery health and charge data | | `water` | `{"enough_water":true,"warn_level":false,"left_ml":1337,...}` | Water tank status | | `plant{1-8}` | `{"sensor_a":...,"sensor_b":...,"mode":"TargetMoisture",...}` | Detailed status for each plant slot | | `pump{1-8}` | `{"enabled":true,"pump_ineffective":false,...}` | Metrics for the last pump activity | | `light` | `{"enabled":true,"active":true,...}` | Night light status | | `deepsleep` | `night 1h` | Why and how long the ESP will sleep | ### Data Structures #### Firmware State (`firmware/state`) Contains a debug dump of the `VersionInfo` struct: - `git_hash`: Branch and commit hash - `build_time`: Compilation timestamp - `current`: Current running partition - `slot0_state`: State of OTA slot 0 - `slot1_state`: State of OTA slot 1 #### MPPT (`mppt`) - `current_ma`: Solar charging current in mA - `voltage_ma`: Solar panel voltage in mV #### Battery (`battery`) Can be `"Unknown"` or an `Info` object: - `voltage_milli_volt`: Battery voltage - `average_current_milli_ampere`: Current draw/charge - `design_milli_ampere_hour`: Battery capacity - `remaining_milli_ampere_hour`: Remaining capacity - `state_of_charge`: Charge percentage (0-100) - `state_of_health`: Health percentage (0-100) - `temperature`: Temperature in degrees Celsius #### Water (`water`) - `enough_water`: Boolean, true if level is above empty threshold - `warn_level`: Boolean, true if level is below warning threshold - `left_ml`: Estimated remaining water in ml - `percent`: Estimated fill level in percent - `raw`: Raw sensor voltage in mV - `sensor_error`: Details if the level sensor fails - `water_frozen`: Boolean, true if temperature is below freezing - `water_temp`: Water temperature in degrees Celsius - `temp_sensor_error`: Details if the temperature sensor fails #### Plant (`plant{1-8}`) - `sensor_a` / `sensor_b`: Moisture sensor status - `Disabled` - `{"MoistureValue":{"raw_hz":5000,"moisture_percent":65}}` - `{"SensorError":{"ShortCircuit":{"hz":...,"max":...}}}` - `mode`: Watering mode (`Off`, `TargetMoisture`, `MinMoisture`, `TimerOnly`) - `do_water`: Boolean, true if watering is currently required - `dry`: Boolean, true if moisture is below target - `cooldown`: Boolean, true if the pump is in cooldown period - `out_of_work_hour`: Boolean, true if currently outside allowed watering hours - `consecutive_pump_count`: Number of pump cycles without reaching target - `pump_error`: Details if the pump is failing - `last_pump`: Timestamp of last activity - `next_pump`: Estimated timestamp for next allowed activity #### Pump (`pump{1-8}`) - `enabled`: Boolean, pump was active - `pump_ineffective`: Boolean, no flow detected during pumping - `median_current_ma`: Median pump current - `max_current_ma`: Peak pump current - `min_current_ma`: Minimum pump current #### Light (`light`) - `enabled`: Boolean, is enabled in config - `active`: Boolean, led is currently on - `out_of_work_hour`: Boolean, led should not be on at this time of day - `battery_low`: Boolean, battery is low so led usage is restricted - `is_day`: Boolean, the sun is up (determined by solar panel voltage)