Seite 1 von 1

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

Verfasst: So 14. Jun 2026, 15:22
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
                  );
                }
              }


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

Verfasst: So 14. Jun 2026, 19:22
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

Microlino CAN-Auswertung mit ESP32 - offener Ansatz für Home Assistant, MQTT und lokale Schnittstellen

Verfasst: Fr 19. Jun 2026, 09:32
von NotATesla
Hallo zusammen

Ich habe auf meinen ersten Beitrag inzwischen einige sehr spannende Rückmeldungen per E-Mail erhalten. Vielen Dank dafür. Es freut mich, dass das Thema offenbar nicht nur für mich interessant ist.

Ich möchte hier kurz einordnen, welchen Ansatz ich aktuell verfolge und warum ich mich im Moment bewusst für eine ESP32-/CAN-Board-Lösung entschieden habe.

Mir geht es aktuell nicht primär darum, ein bestimmtes fertiges Produkt oder eine bestehende Komplettlösung zu verwenden. Mein Ziel ist im Moment, möglichst nahe an der Quelle zu sein. Das heisst: CAN-Bus passiv mitlesen, die relevanten Frames verstehen, die Werte sauber auswerten und diese dann offen und nachvollziehbar zur Verfügung stellen.

Der Vorteil eines ESP32 mit CAN-Board ist für mich vor allem:

* Ich habe volle Kontrolle über den Programmcode.
* Ich kann genau die Werte auslesen und aufbereiten, die mich interessieren.
* Die Lösung ist günstig und grundsätzlich einfach nachbaubar.
* Der Ansatz kann offen dokumentiert und weiterentwickelt werden.
* Es entsteht keine Abhängigkeit von einem bestimmten kommerziellen System oder einer Cloud.

Aktuell liegt mein Fokus darauf, zuerst die Basis stabil zu bekommen: Welche CAN-IDs liefern welche Werte, welche Werte sind wirklich belastbar und welche sind nur Kandidaten. Erst wenn diese Grundlage sauber ist, macht es aus meiner Sicht Sinn, weitere Schnittstellen und Komfortfunktionen auszubauen.

MQTT ist dabei grundsätzlich kein Problem. Das ist vorbereitet beziehungsweise mit wenig Aufwand ergänzbar. Aktuell ist es bei mir aber noch nicht aktiv, weil ich persönlich zuerst die direkte Integration und die Auswertung stabil haben möchte. Sobald die Sensorwerte zuverlässig sind, können diese natürlich auch per MQTT publiziert werden.

Zusätzlich kann der ESP32 lokal eine eigene kleine Webseite bereitstellen. Damit lassen sich Sensorwerte direkt im Browser anzeigen oder auch automatisiert abrufen, zum Beispiel per `curl`. Das ist aus meiner Sicht ein guter Weg, weil die Daten dadurch nicht zwingend an ein bestimmtes Smart-Home-System gebunden sind.

Mein aktueller Fokus liegt trotzdem klar auf Home Assistant. Das ist meine persönliche Präferenz, weil mein restliches Zuhause bereits relativ stark darin integriert ist. Dazu gehören bei mir unter anderem PV-Steuerung, Energieoptimierung, Haustür, Lichtsteuerung über Bewegungsmelder, Helligkeit, Wetterdaten und Sonnenstand. Für mich ist es deshalb naheliegend, auch den Microlino dort einzubinden. So können Fahrzeugdaten später nicht nur angezeigt, sondern auch sinnvoll mit bestehenden Automationen kombiniert werden.

Das soll ausdrücklich keine Kritik an OpenHAB, ioBroker, OVMS, WiCAN oder anderen Lösungen sein. Viele davon sind ebenfalls spannend und haben ihre Berechtigung. Für meinen eigenen Aufbau hat sich Home Assistant aber am besten bewährt, vor allem wegen der grossen Community, der vielen Integrationen und der flexiblen Erweiterbarkeit.

Langfristig wäre mein Wunsch, dass daraus eine möglichst offene und nachvollziehbare Lösung entsteht, die andere Microlino-Besitzer ebenfalls nachbauen oder erweitern können. Ob die Werte später über Home Assistant, MQTT, eine lokale Webseite, ioBroker oder eine andere Plattform genutzt werden, sollte aus meiner Sicht möglichst offen bleiben.

Ich stehe noch am Anfang, aber die ersten Werte sind bereits vielversprechend. Wichtig ist mir dabei, sauber zu trennen zwischen bestätigten Werten und experimentellen Kandidaten. Alles, was noch nicht belastbar ist, sollte auch entsprechend gekennzeichnet werden.

Wer ebenfalls am CAN-Bus, OBD-Daten, Ladezustand, Ladebegrenzung oder einer offenen Microlino-Integration arbeitet, darf sich gerne melden. Ein gemeinsames Dokumentieren der Erkenntnisse wäre aus meiner Sicht sehr sinnvoll.


Hier mal ein Bildchen zum Webserver:
Folie1.jpeg

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

Verfasst: Fr 19. Jun 2026, 15:40
von Sunneraindler
Und genau das überfordert mich "Dummy" schon total 😢

Darum wünsche ich mir eine "pfannenfertige Lösung" 🤗