0

I have a netgain hyper9 motor and controller. Controller is hooked up to CAN bus. I am using an esp32 with mcp2515 to read the data. The format is as in the image here. I can read a byte ok and get a number but can not correctly read the word (2bytes) nor can I get the correct bitmap. I am using esphome to read this through a lambda function. Are there any c++ / esphome lambda people that could help?

WORD FORMAT: All words are sent in Little-endian format which reverses the order and stores the least significant byte at the lower memory address with the most significant byte being stored at the highest memory address.

byte word format: byte word format

reading a bitmask: reading a bitmask

reading rpm through 2 byte word: reading rpm through 2 byte word

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO14
    can_id: 2
    use_extended_id: false
    bit_rate: 250KBPS
    clock: 8MHZ
    mode: NORMAL
    on_frame:
    - can_id: 0x301 #[canbus:066]: received can message std can_id=0x301 size=8
      use_extended_id: false
      then:
      - lambda: |-
            //State of Charge - works ok
            int soc = x[2];
            id(motor_battery_soc).publish_state(soc);

            //RPM - word format
            std::string r1 = to_string(x[0]);
            std::string r2 = to_string(x[1]);
            std::string rpmString = r2 + r1;
            id(motor_rpm).publish_state(rpmString);

            //System flags
            ESP_LOGD("system_flags x3: ", "%d", x[3] );
            ESP_LOGD("system_flags x4: ", "%d", x[4] );
            std::string sf1 = to_string(x[3]);
            std::string sf2 = to_string(x[4]);
            std::string sfString = sf2 + sf1;
            std::string sflag = " ";
            ESP_LOGD("main", "sfString: %s", sfString);

            // *** I know this is not correct because should search for a true/false flag on the bitmask ***
            int sfInt = atoi(sfString.c_str());
            ESP_LOGD("sfInt: ", "%d", sfInt);
            switch(sfInt) {
              case 0:
                sflag = "SoC is Low For Traction";
                id(motor_system_flags).publish_state("SoC is Low For Traction");
                break; 
              case 1:
                sflag = "SoC is Low For Hydraulic";
                id(motor_system_flags).publish_state("SoC is Low For Hydraulic");
                break;
              case 2:
                sflag = "Reverse Direction Active";
                id(motor_system_flags).publish_state("Reverse Direction Active");
                break;
              case 3:
                sflag = "Forward Direction Active";
                id(motor_system_flags).publish_state("Forward Direction Active");
                break;  
              case 4:
                sflag = "Park Brake Active";
                id(motor_system_flags).publish_state("Park Brake Active");
                break;  
              case 5:
                sflag = "Pedal Brake Active";
                id(motor_system_flags).publish_state("Pedal Brake Active");
                break;  
              case 6:
                sflag = "Controller is in Overtemperature";
                id(motor_system_flags).publish_state("Controller is in Overtemperature");
                break;  
              case 7:
                sflag = "Key Switch Overvoltage";
                id(motor_system_flags).publish_state("Key Switch Overvoltage");
                break;  
              case 8:
                sflag = "Key Switch Undervoltage";
                id(motor_system_flags).publish_state("Key Switch Undervoltage");
                break;  
              case 9:
                sflag = "Vehicle is Running";
                id(motor_system_flags).publish_state("Vehicle is Running");
                break;  
              case 10:
                sflag = "Traction is Enabled";
                id(motor_system_flags).publish_state("Traction is Enabled");
                break;  
              case 11:
                sflag = "Hydraulic is Enabled";
                id(motor_system_flags).publish_state("Hydraulic is Enabled");
                break;  
              case 12:
                sflag = "Powering is Enabled";
                id(motor_system_flags).publish_state("Powering is Enabled");
                break;  
              case 13:
                sflag = "Powering is Ready";
                id(motor_system_flags).publish_state("Powering is Ready");
                break;  
              case 14:
                sflag = "Powering is Precharging";
                id(motor_system_flags).publish_state("Powering is Precharging");
                break;  
              case 15:
                sflag = "Main Contactor Closing";
                id(motor_system_flags).publish_state("Main Contactor Closing");
                break;  
              default:
                sflag = "No System Flag";
                break;
            }
            id(motor_system_flags).publish_state(sflag);

            //Fault code
            int fault_code = x[5];
            id(motor_fault_code).publish_state(fault_code);
            
            //Motor Temp
            int temp = x[6] - 40;
            id(motor_temp).publish_state(temp);


text_sensor:
  - platform: template
    id: motor_system_flags
    name: "Motor System Flags"
  - platform: template
    id: motor_rpm
    name: "Motor RPM"

sensor:
  - platform: template
    id: motor_battery_soc
    name: "Motor Battery SoC"
    accuracy_decimals: 0
  - platform: template
    id: motor_fault_code
    name: "Motor Fault Code"
  - platform: template
    id: motor_temp
    name: "Motor Temp"
    accuracy_decimals: 0

Dennis
  • 1
  • 2

0 Answers0