Hardware:

The below YAML contains sections for both H&T Sensor and Gate Opener.

  • H&T Sensor:
    • sensor: 2x packet_transport
    • sensor: 2x template
    • packet_transport: 1x providers
  • Gate Opener:
    • switch: 3x template
    • packet_transport: 3x binary_sensors
    • packet_transport: 1x providers
    • binary_sensor: 3x template
    • binary_sensor: 3x packet_transport
esphome:
  name: lora-base-station
  friendly_name: LoRa Base Station

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "WhNJ2bY6xjaFHs3C844w4/uAYMGvcmcGoBggQDjnvhg="

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid_iot
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    password: !secret ap_password

captive_portal:

# SPI bus for LoRa radio
spi:
  clk_pin:
    number: GPIO05
    ignore_strapping_warning: true    
  mosi_pin: GPIO27
  miso_pin: GPIO19

# I2C for OLED display
i2c:
  sda: GPIO21
  scl: GPIO22
  frequency: 400kHz

# LoRa Radio Configuration (SX1276/SX1278)
sx127x:
  dio0_pin: GPIO26
  cs_pin: GPIO18
  rst_pin: GPIO14
  pa_pin: BOOST
  pa_power: 17
  bandwidth: 125_0kHz
  preamble_size: 6
  crc_enable: true
  frequency: 868920000
  modulation: LORA
  rx_start: true
  sync_value: 0x12
  spreading_factor: 7
  coding_rate: CR_4_5
  on_packet:
    then:
      - lambda: |-
          ESP_LOGD("lambda", "Packet: %s", format_hex(x).c_str());
          ESP_LOGD("lambda", "RSSI: %.2f dBm", rssi);
          ESP_LOGD("lambda", "SNR: %.2f dB", snr);

# OLED Display
display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      it.printf(0, 0, id(display_font), "LoRa Base");
      it.horizontal_line(0, 16, 128);
      it.printf(0, 20, id(display_font), "WiFi: %.1f dBm", id(wifi_signal_db).state);

font:
  - file: "gfonts://Roboto"
    id: display_font
    size: 10

button:
  - platform: restart
    name: "Restart"

sensor:
  - platform: wifi_signal
    id: wifi_signal_db
    name: "WiFi Signal"
    update_interval: 10s

  - platform: packet_transport
    id: temperature
    provider: lora-remote-station-1

  - platform: packet_transport
    id: humidity
    provider: lora-remote-station-1

  - platform: template
    name: Temperature
    device_class: temperature
    unit_of_measurement: °C
    update_interval: 1min
    lambda: return id(temperature).state;

  - platform: template
    name: Humidity
    device_class: humidity
    unit_of_measurement: "%"
    update_interval: 1min
    lambda: return id(humidity).state;

switch:
  - platform: template
    name: Relay 1
    id: relay1
    optimistic: True

  - platform: template
    name: Relay 1 Plus
    id: relay1plus
    optimistic: True

  - platform: template
    name: Relay 2
    id: relay2
    optimistic: True

  - platform: template
    name: Enable WiFi
    id: enable_wifi
    optimistic: True

packet_transport:
  platform: sx127x
  update_interval: 1min
  encryption: "My3ncryPt10n"
  rolling_code_enable: False
  binary_sensors: 
    - relay1_lora_base_station
    - relay1plus_lora_base_station
    - relay2_lora_base_station
    - enable_wifi_lora_base_station
  providers:
    - name: lora-remote-station-1
      encryption: "My3ncryPt10n"
    - name: lora-remote-station-2
      encryption: "My3ncryPt10n"

binary_sensor:
  - platform: template
    id: relay1_lora_base_station
    lambda: return id(relay1).state;
    
  - platform: template
    id: relay1plus_lora_base_station
    lambda: return id(relay1plus).state;

  - platform: template
    id: relay2_lora_base_station
    lambda: return id(relay2).state;

  - platform: template
    id: enable_wifi_lora_base_station
    lambda: return id(enable_wifi).state;
    
  - platform: packet_transport
    id: relay1_lora_remote_station_2
    provider: lora-remote-station-2
    on_press:
      switch.turn_on: relay1
    on_release:
      switch.turn_off: relay1
      
  - platform: packet_transport
    id: relay1plus_lora_remote_station_2
    provider: lora-remote-station-2
    on_press:
      switch.turn_on: relay1plus
    on_release:
      switch.turn_off: relay1plus

  - platform: packet_transport
    id: relay2_lora_remote_station_2
    provider: lora-remote-station-2
    on_press:
      switch.turn_on: relay2
    on_release:
      switch.turn_off: relay2