# VanAlign Solar - Votronic Solarladeregler über BLE # # Zweiter ESP32 im Fahrzeug, unabhängig vom Neigungssensor (esp32_ble.yaml). # Liest den Votronic-Solarladeregler über den Displaylink-Port (UART) mit der # externen Komponente github://syssi/esphome-votronic aus und stellt die # Werte - genau wie beim Neigungssensor - über einen eigenen BLE-Service # bereit. Zusätzlich (für Debug-Zwecke) läuft WLAN mit und die Werte werden # auch auf dem eingebauten Webserver (Port 80) angezeigt - MQTT und die API # sind weiterhin nicht enthalten. WLAN-Zugangsdaten liegen in secrets.yaml # (lokal anzulegen, ist per .gitignore ausgeschlossen). # # Verkabelung: UART TX=GPIO4, RX=GPIO5 an den Displaylink-Port des Reglers, # Baudrate 1000 (kein Tippfehler - das Votronic-Protokoll nutzt diese # ungewöhnlich niedrige Rate). Board/Pins ggf. an die tatsächlich verbaute # Hardware anpassen, hier als ESP32-S3-DevKitC-1 wie beim Neigungssensor # angenommen. # # BLE-Service 05c9a349-2b8e-4b1d-9c9d-c247e9a6a001 (wird beworben): # # Charakteristik UUID (Ende) Inhalt # Batteriespg. ...a101 Float32 LE, Volt # PV-Spannung ...a102 Float32 LE, Volt # PV-Strom ...a103 Float32 LE, Ampere # PV-Leistung ...a104 Float32 LE, Watt # Reglertemp. ...a105 Float32 LE, °C # Statusflags ...a106 1 Byte, Bitmaske: Bit0 Batterie lädt, # Bit1 Batterie entlädt, Bit2 PV-Regler # aktiv, Bit3 PV-Strombegrenzung, Bit4 AES # PV-Modus-ID ...a107 1 Byte, roher Wert aus pv_mode_setting_id # Batteriestatus ...a108 1 Byte, rohe Bitmaske aus dem Regler # Reglerstatus ...a109 1 Byte, rohe Bitmaske aus dem Regler # # Alle Charakteristiken sind reine Lesewerte, wie beim Neigungssensor fragt # der Client sie im Takt ab. esphome: name: vanalign-solar friendly_name: "VanAlign Solar" esp32: board: esp32-s3-devkitc-1 flash_size: 16MB framework: type: esp-idf # N16R8: 16 MB Flash + 8 MB PSRAM, beim S3 als Octal-PSRAM angebunden. psram: mode: octal speed: 80MHz logger: level: WARN wifi: ssid: !secret wifi_ssid password: !secret wifi_password web_server: port: 80 external_components: - source: github://syssi/esphome-votronic@main refresh: 0s uart: - id: uart_0 baud_rate: 1000 tx_pin: GPIO4 rx_pin: GPIO5 votronic: - id: votronic0 uart_id: uart_0 rx_timeout: 150ms throttle: 2s sensor: - platform: votronic votronic_id: votronic0 battery_computer_battery_voltage: name: "Batteriespannung" id: battery_voltage pv_voltage: name: "PV Spannung" id: pv_voltage pv_current: name: "PV Strom" id: pv_current pv_power: name: "PV Leistung" id: pv_power pv_controller_temperature: name: "Reglertemperatur" id: pv_temperature pv_mode_setting_id: name: "PV Modus-ID" id: pv_mode_id pv_battery_status_bitmask: name: "PV Batteriestatus (Bitmaske)" id: pv_battery_status_bitmask pv_controller_status_bitmask: name: "PV Reglerstatus (Bitmaske)" id: pv_controller_status_bitmask binary_sensor: - platform: votronic votronic_id: votronic0 battery_computer_charging: name: "Batterie lädt" id: battery_charging battery_computer_discharging: name: "Batterie entlädt" id: battery_discharging pv_controller_active: name: "PV Regler aktiv" id: pv_active pv_current_reduction: name: "PV Strombegrenzung" id: pv_current_reduction pv_aes_active: name: "PV AES aktiv" id: pv_aes_active text_sensor: - platform: votronic votronic_id: votronic0 pv_mode_setting: name: "PV Modus" pv_battery_status: name: "PV Batteriestatus" pv_controller_status: name: "PV Reglerstatus" - platform: template name: "Firmware Version" id: firmware_version icon: mdi:tag lambda: |- return {"v1.0.0"}; esp32_ble_server: services: - uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a001 advertise: true characteristics: - id: battery_voltage_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a101 description: "Batteriespannung" read: true value: !lambda |- std::vector v(sizeof(float)); float val = id(battery_voltage).state; memcpy(v.data(), &val, sizeof(float)); return v; - id: pv_voltage_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a102 description: "PV Spannung" read: true value: !lambda |- std::vector v(sizeof(float)); float val = id(pv_voltage).state; memcpy(v.data(), &val, sizeof(float)); return v; - id: pv_current_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a103 description: "PV Strom" read: true value: !lambda |- std::vector v(sizeof(float)); float val = id(pv_current).state; memcpy(v.data(), &val, sizeof(float)); return v; - id: pv_power_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a104 description: "PV Leistung" read: true value: !lambda |- std::vector v(sizeof(float)); float val = id(pv_power).state; memcpy(v.data(), &val, sizeof(float)); return v; - id: pv_temperature_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a105 description: "Reglertemperatur" read: true value: !lambda |- std::vector v(sizeof(float)); float val = id(pv_temperature).state; memcpy(v.data(), &val, sizeof(float)); return v; # Bit0 Batterie lädt, Bit1 Batterie entlädt, Bit2 PV-Regler aktiv, # Bit3 PV-Strombegrenzung, Bit4 AES aktiv. - id: status_flags_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a106 description: "Statusflags" read: true value: !lambda |- std::vector v(1, 0); uint8_t flags = 0; if (id(battery_charging).state) flags |= (1 << 0); if (id(battery_discharging).state) flags |= (1 << 1); if (id(pv_active).state) flags |= (1 << 2); if (id(pv_current_reduction).state) flags |= (1 << 3); if (id(pv_aes_active).state) flags |= (1 << 4); v[0] = flags; return v; - id: pv_mode_id_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a107 description: "PV Modus-ID" read: true value: !lambda |- std::vector v(1, 0); v[0] = (uint8_t) id(pv_mode_id).state; return v; - id: pv_battery_status_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a108 description: "PV Batteriestatus (Bitmaske)" read: true value: !lambda |- std::vector v(1, 0); v[0] = (uint8_t) id(pv_battery_status_bitmask).state; return v; - id: pv_controller_status_ble uuid: 05c9a349-2b8e-4b1d-9c9d-c247e9a6a109 description: "PV Reglerstatus (Bitmaske)" read: true value: !lambda |- std::vector v(1, 0); v[0] = (uint8_t) id(pv_controller_status_bitmask).state; return v; button: - platform: restart name: "ESP Restart"