Initial project: XIAO ESP32S3 + SX1262 LoRa sensor link hytte–hjem

- cabin_node: subscribes to local MQTT (ESPHome sensors), sends
  temperature, battery voltage/SOC and switch states over LoRa SF12
- cabin_gw: receives LoRa packets, publishes JSON to home MQTT broker
- Bidirectional: gateway forwards ON/OFF commands from home HA to node
- cabin_node always in RX mode (12V powered) — commands arrive instantly
- ESPHome config for ESP32 on teknisk rom: Victron MPPT BLE + JBD BMS
  BLE + DS18B20 temperatures + GPIO switches for varme/VVB

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 23:11:35 +01:00
commit a544594769
11 changed files with 756 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
#pragma once
#include <stdint.h>
#define CABIN_PACKET_MAGIC 0xCA
#define CABIN_CMD_MAGIC 0xCB
// Command IDs
#define CMD_VARME 0x01
#define CMD_VVB 0x02 // varmtvannsbereder
// Wire format: 13 bytes total
// At SF12 BW125: ~1.3s airtime
// flags bits: 0=varme, 1=vvb (1=on, 0=off)
#define CABIN_FLAG_VARME (1 << 0)
#define CABIN_FLAG_VVB (1 << 1)
struct __attribute__((packed)) CabinPacket {
uint8_t magic; // = CABIN_PACKET_MAGIC
uint8_t seq; // rolling counter
int16_t temp_in_x10; // indoor temp * 10 (213 = 21.3 °C), INT16_MIN = no data
int16_t temp_out_x10; // outdoor temp * 10, INT16_MIN = no data
uint16_t batt_mv; // battery voltage mV (12V system: ~1000014400)
uint8_t batt_pct; // SOC 0100, 0xFF = no data
uint8_t flags; // switch states: bit0=varme, bit1=vvb
uint32_t sig; // truncated HMAC-SHA256
};
// Command packet: home → gateway → node → ESPHome switch
// 8 bytes total
struct __attribute__((packed)) CabinCmdPacket {
uint8_t magic; // = CABIN_CMD_MAGIC
uint8_t seq;
uint8_t cmd_id; // CMD_VARME, CMD_VVB, ...
uint8_t value; // 0 = off, 1 = on
uint32_t sig;
};