Bei Neu-Registrierung:

Bestätigungsemail nicht vergessen! Emailadresse erscheint während des Anmeldevorganges (oder an die Kontaktadresse).
Warum ist die Mitgliederanzahl hier in diesem Forum immer fast gleichbleibend?
Weil alle, die sich ein Jahr lang nie angemeldet haben, deaktiviert bzw gelöscht werden (siehe Anleitung und Regeln: https://www.microlino-forum.ch/viewtopic.php?t=455
)

Open Microlino: CAN-Bus Analyse, SOC und Smart-Home Integration

Antworten
NotATesla
Neuling
Beiträge: 3
Registriert: So 14. Jun 2026, 09:28
Microlino-Modell: Das mit 4 Räder :) Aufbau 2.0
Danksagung erhalten: 5 Mal

Open Microlino: CAN-Bus Analyse, SOC und Smart-Home Integration

Beitrag von NotATesla »

Hallo zusammen

Ich bin neu hier und das ist mein erster Beitrag hier im Forum.

Ich bin eher der Technikfreak und beschäftige mich aktuell damit, den Microlino etwas smarter zu machen. Mein Ziel ist es, über den CAN-Bus verschiedene Signale auszulesen und diese später zum Beispiel in Home Assistant nutzbar zu machen.

Aktuell stehe ich noch am Anfang, konnte aber bereits erste Teilerfolge erzielen. Ich verwende dafür dieses Board:

https://de.aliexpress.com/item/10050118 ... pt=glo2deu

Weitere Infos zum Board:
https://github.com/WeActStudio/WeActStu ... rdV1_ESP32

Bisher kann ich die Batteriespannung bereits relativ zuverlässig auslesen. Auch die 12-V-Batteriespannung lässt sich messen und überwachen. Weitere Werte wie Türstatus, Kofferraumstatus usw. sehe ich teilweise ebenfalls bereits im CAN-Traffic, diese sind aber noch nicht sauber zugeordnet oder bestätigt.

Mein aktueller Fokus liegt vor allem auf der Hochvolt-Batteriespannung und dem SOC. Dabei habe ich teilweise das Gefühl, dass der SOC auf dem Tacho nicht immer ganz mit den technischen bzw. physikalisch ausgelesenen Daten übereinstimmt. Das ist aber aktuell nur eine Beobachtung und noch keine gesicherte Aussage.

Über USB werden im Moment sämtliche CAN-Änderungen mitgeloggt, damit ich nach und nach herausfinden kann, welche CAN-ID für welchen Wert oder Status zuständig ist.

Mögliche spätere Ideen wären zum Beispiel:

* Ladezustand in Home Assistant anzeigen
* Laden bis zu einem bestimmten SOC steuern
* Eine Ladestation abhängig vom SOC oder PV-Überschuss regeln
* Zustände wie Türen, Kofferraum oder Ladeanschluss auswerten
* Eventuell Funktionen wie Ladeanschluss öffnen oder ähnliche Komfortfunktionen prüfen
* Auf SD Karte Loggen ggf. Zuhause via W-LAN an Homeassistant übertragen etc.

Im Anhang habe ich einmal ein YAML meines aktuellen Stands beigelegt.

Falls jemand bereits mehr Informationen zu den CAN-Adressen, der Dokumentation oder Erfahrungen mit dem Microlino-CAN-Bus hat, würde ich mich sehr über Hinweise freuen. Auch jeder, der Lust hat mitzuhelfen oder mitzudenken, ist herzlich willkommen.

Viele Grüsse
Henry

Code: Alles auswählen

esphome:
  name: microlino-can-sniffer
  friendly_name: Microlino CAN Sniffer

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:
  level: INFO
  baud_rate: 115200

api:

ota:
  platform: esphome

wifi:
  ssid: "xxxxxxxx"
  password: "xxxxxxxx"

  ap:
    ssid: "Microlino CAN Fallback"
    password: "12345678"

captive_portal:

# BLE Beacon fuer Bermuda / Positionszuordnung
# Das Microlino-CAN-Board sendet als iBeacon.
esp32_ble_beacon:
  type: iBeacon
  uuid: "c0a80107-0000-4000-8000-000006080107"
  major: 107
  minor: 1
  measured_power: -59
  min_interval: 500ms
  max_interval: 1000ms

sensor:
  - platform: template
    name: "Microlino HV Spannung Kandidat"
    id: microlino_hv_voltage
    unit_of_measurement: "V"
    accuracy_decimals: 3
    device_class: voltage
    state_class: measurement
    icon: mdi:car-battery

  - platform: adc
    pin: GPIO36
    name: "Microlino Bordspannung"
    id: microlino_bordspannung
    attenuation: 12db
    unit_of_measurement: "V"
    accuracy_decimals: 2
    device_class: voltage
    state_class: measurement
    update_interval: 5s
    filters:
      - multiply: 12.0
      - median:
          window_size: 7
          send_every: 3

  - platform: template
    name: "Microlino CAN107 Byte0"
    id: microlino_can107_byte0
    accuracy_decimals: 0
    state_class: measurement

  - platform: template
    name: "Microlino CAN107 Byte1"
    id: microlino_can107_byte1
    accuracy_decimals: 0
    state_class: measurement

  - platform: template
    name: "Microlino CAN107 Byte2"
    id: microlino_can107_byte2
    accuracy_decimals: 0
    state_class: measurement

  - platform: template
    name: "Microlino CAN107 Byte3"
    id: microlino_can107_byte3
    accuracy_decimals: 0
    state_class: measurement

canbus:
  - platform: esp32_can
    id: microlino_can
    tx_pin: GPIO27
    rx_pin: GPIO26
    bit_rate: 500kbps
    can_id: 0x001
    use_extended_id: false

    on_frame:
      - can_id: 0x000
        can_id_mask: 0x000
        then:
          - lambda: |-
              struct CanState {
                uint32_t id;
                uint8_t len;
                uint8_t data[8];
                bool used;
              };

              static CanState states[128];

              int slot = -1;

              for (int i = 0; i < 128; i++) {
                if (states[i].used && states[i].id == can_id) {
                  slot = i;
                  break;
                }
              }

              if (slot == -1) {
                for (int i = 0; i < 128; i++) {
                  if (!states[i].used) {
                    slot = i;
                    states[i].used = true;
                    states[i].id = can_id;
                    states[i].len = 0;
                    memset(states[i].data, 0, 8);
                    break;
                  }
                }
              }

              if (slot == -1) {
                ESP_LOGW("CAN", "Kein freier Speicherplatz fuer ID 0x%03X", can_id);
                return;
              }

              bool changed = false;

              if (states[slot].len != x.size()) {
                changed = true;
              } else {
                for (uint8_t i = 0; i < x.size(); i++) {
                  if (states[slot].data[i] != x[i]) {
                    changed = true;
                    break;
                  }
                }
              }

              if (!changed)
                return;

              char old_data[40];
              char new_data[40];

              old_data[0] = '\0';
              new_data[0] = '\0';

              for (uint8_t i = 0; i < states[slot].len; i++) {
                char byte_text[5];
                sprintf(byte_text, "%02X ", states[slot].data[i]);
                strcat(old_data, byte_text);
              }

              for (uint8_t i = 0; i < x.size(); i++) {
                char byte_text[5];
                sprintf(byte_text, "%02X ", x[i]);
                strcat(new_data, byte_text);
              }

              ESP_LOGI(
                "CAN_CHANGE",
                "ID 0x%03X DLC %d: %s -> %s",
                can_id,
                x.size(),
                old_data,
                new_data
              );

              states[slot].len = x.size();
              memset(states[slot].data, 0, 8);

              for (uint8_t i = 0; i < x.size(); i++) {
                states[slot].data[i] = x[i];
              }

              // --------------------------------------------------
              // Microlino CAN107 Rohwerte fuer Analyse
              // --------------------------------------------------

              if (can_id == 0x107 && x.size() >= 4) {
                id(microlino_can107_byte0).publish_state(x[0]);
                id(microlino_can107_byte1).publish_state(x[1]);
                id(microlino_can107_byte2).publish_state(x[2]);
                id(microlino_can107_byte3).publish_state(x[3]);

                ESP_LOGI(
                  "CAN107_RAW",
                  "B0=%u B1=%u B2=%u B3=%u",
                  x[0],
                  x[1],
                  x[2],
                  x[3]
                );
              }

              // --------------------------------------------------
              // Microlino HV-Spannung Kandidat
              // CAN-ID 0x18D
              // --------------------------------------------------

              if (can_id == 0x18D && x.size() >= 5) {

                uint16_t raw1 =
                    ((uint16_t)x[4] << 8) |
                    x[3];

                float voltage1 =
                    raw1 / 1000.0f;

                uint16_t raw2 =
                    ((uint16_t)x[3] << 8) |
                    x[4];

                float voltage2 =
                    raw2 / 1000.0f;

                ESP_LOGI(
                  "HV_DEBUG",
                  "0x18D RAW1=%u (%.3fV) RAW2=%u (%.3fV)",
                  raw1,
                  voltage1,
                  raw2,
                  voltage2
                );

                float voltage = 0.0f;

                if (voltage1 > 40.0f && voltage1 < 70.0f) {
                  voltage = voltage1;
                } else if (voltage2 > 40.0f && voltage2 < 70.0f) {
                  voltage = voltage2;
                }

                if (voltage > 0.0f) {
                  id(microlino_hv_voltage).publish_state(voltage);

                  ESP_LOGI(
                    "HV_EST",
                    "Voltage=%.3fV",
                    voltage
                  );
                }
              }

NotATesla
Neuling
Beiträge: 3
Registriert: So 14. Jun 2026, 09:28
Microlino-Modell: Das mit 4 Räder :) Aufbau 2.0
Danksagung erhalten: 5 Mal

Re: Open Microlino: CAN-Bus Analyse, SOC und Smart-Home Integration

Beitrag von NotATesla »

Update:

HV-Batteriespannung
0x18D Byte 3/4
🟢 95 % Sicher


Laden aktiv
0x18D Byte 6 = 0x20
🟢 90 % Sicher


Ladestecker angeschlossen
0x18D Byte 6 = 0x04 oder 0x20
🟡 75 % Sicher


12-V-Bordnetzspannung
GPIO36 ADC
🟢 100 % Sicher
Antworten

Zurück zu „Technik“