Canbus Protokoll AC-Charger

Grüße, ich weis nicht ob das hier rein passt wenn nicht einfach löschen.
Habe mich frisch registriert. Bin 36 Jahre Jung, und habe da mal eine Frage bezüglich des Can Protokolls.
Ich wollte mein Huawei R4875G mit meiner Victron Anlage verknüpfen. Mein Plan ist einen Mikrocontroller mit 2 CAN Bussen. Can0 soll einen AC-Charger emulieren, Can1 Soll mit dem Huawei Netzteil reden und sozusagen dann alles auf den AC-Charger-Emulator übersetzten.

Ist da irgendwie das Can-Protokoll in Richtung AC-Charger bekannt, das Huawei ist ja kein Problem?
Wer kann mir da mel Helfen

Vielen Danke und beste Grüße
PS: Ich poste mal meine Arduino Code.Ist erstmal nur die Victron Seite drinnen. Leider zeigt mein CerboGX kein Gerät an.

// RV-C-kompatibler Victron BlueSolar Emulator (Cerbo GX auf RV-C stellen!)
#include <SPI.h>
#include <mcp_can.h>

#define CAN0_CS 53
#define CAN0_INT 2
MCP_CAN CAN0(CAN0_CS);

float voltage = 54.2;
float current = 12.8;
float panelVoltage = 73.5;
uint8_t chargeStage = 2; // 1 = Bulk, 2 = Absorption, 3 = Float

volatile bool can0_irq = false;
unsigned long lastHeartbeat = 0;
unsigned long lastPvStatus = 0;
unsigned long lastIdInfo = 0;
unsigned long lastClaim = 0;
unsigned long lastDevClass = 0;
unsigned long lastDeviceName = 0;

const uint8_t RV_SOURCE_ADDR = 0x22;

uint32_t makeRVCId(uint32_t pgn) {
  return (uint32_t)(6 << 26) | (pgn << 8) | RV_SOURCE_ADDR;
}

void can0_isr() {
  can0_irq = true;
}

void sendAddressClaim() {
  byte data[8] = { 0x12, 0x34, 0x56, 0x79, 'B', 'L', 'U', 0x00 };
  CAN0.sendMsgBuf(0xEE00, 0, 8, data);
}

void sendHeartbeat() {
  byte data[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 };
  CAN0.sendMsgBuf(makeRVCId(0x1FECA), 1, 8, data);
}

void sendBlueSolarStatus() {
  byte data[8];
  uint16_t battVolt = (uint16_t)(voltage * 100);
  uint16_t battCurr = (uint16_t)(current * 10);
  uint16_t pvVolt = (uint16_t)(panelVoltage * 100);

  data[0] = battVolt & 0xFF;
  data[1] = battVolt >> 8;
  data[2] = battCurr & 0xFF;
  data[3] = battCurr >> 8;
  data[4] = pvVolt & 0xFF;
  data[5] = pvVolt >> 8;
  data[6] = chargeStage;
  data[7] = 0x00;

  CAN0.sendMsgBuf(makeRVCId(0x1FF215), 1, 8, data); // PGN für Solar Controller Status (fiktiv)
}

void sendIdentification() {
  byte data[8] = { 'B', 'L', 'U', 'E', 'S', 'O', 'L', 'R' };
  CAN0.sendMsgBuf(makeRVCId(0x1FFF00), 1, 8, data);
}

void sendDeviceClassInfo() {
  byte data[8] = {
    0xA0, // Funktion frei gewählt für Victron-kompatibles Mapping
    0x01, // Instance
    0x00, // Manufacturer Code LSB
    0x6A, // Manufacturer Code MSB
    0xA4, // Device Class (Victron typisch für Charger/Solar)
    0x00, 0x00, 0x00
  };
  CAN0.sendMsgBuf(makeRVCId(0x1FEE6), 1, 8, data);
}

void sendDeviceName() {
  byte data[8] = { 'S', 'm', 'a', 'r', 't', 'S', 'o', 'l' };
  CAN0.sendMsgBuf(makeRVCId(0x1FEE3), 1, 8, data); // PGN 0x1FEE3 - Friendly Name Block 1
}

void setup() {
  Serial.begin(115200);
  SPI.begin();
  pinMode(CAN0_INT, INPUT_PULLUP);

  if (CAN0.begin(MCP_STDEXT, CAN_250KBPS, MCP_16MHZ) == CAN_OK) {
    Serial.println("CAN init OK");
    CAN0.setMode(MCP_NORMAL);
  } else {
    Serial.println("CAN init FAIL");
    while (1);
  }

  attachInterrupt(digitalPinToInterrupt(CAN0_INT), can0_isr, FALLING);
}

void loop() {
  if (can0_irq) {
    can0_irq = false;
    long unsigned int rxId;
    byte len = 0;
    byte buf[8];
    while (CAN0.checkReceive() == CAN_MSGAVAIL) {
      CAN0.readMsgBuf(&rxId, &len, buf);
      Serial.print("RX ID: 0x"); Serial.print(rxId, HEX);
      Serial.print(" Data: ");
      for (int i = 0; i < len; i++) {
        if (buf[i] < 0x10) Serial.print("0");
        Serial.print(buf[i], HEX); Serial.print(" ");
      }
      Serial.println();
    }
  }

  unsigned long now = millis();

  if (now - lastHeartbeat > 1000) {
    lastHeartbeat = now;
    sendHeartbeat();
  }
  if (now - lastPvStatus > 2000) {
    lastPvStatus = now;
    sendBlueSolarStatus();
  }
  if (now - lastIdInfo > 10000) {
    lastIdInfo = now;
    sendIdentification();
  }
  if (now - lastClaim > 15000) {
    lastClaim = now;
    sendAddressClaim();
  }
  if (now - lastDevClass > 5000) {
    lastDevClass = now;
    sendDeviceClassInfo();
  }
  if (now - lastDeviceName > 7000) {
    lastDeviceName = now;
    sendDeviceName();
  }

  delay(100);
}