Reading an EV Motor canbus data

Hello All,

I am using an esp32 with an mcp2515 connected. I am using it to read the can bus data of the EV motor I have in my boat. I have it setup and semi-working, but…
The data can come in 2 forms, a byte for things like a 0 to 100 percent value ie state of charge, or a word format which is made up of 2 bytes. I am able to read the single 1 byte values but I am still stuck on the 2 byte word values.

  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO15
    can_id: 4
    use_extended_id: false
    bit_rate: 250KBPS
    clock: 8MHZ #One of 8MHZ, 16MHZ or 20MHZ
    - can_id: 0x301 #[canbus:066]: received can message std can_id=0x301 size=8
      use_extended_id: false
      - lambda: |-
          int xSize = x.size();
          ESP_LOGD("xSize: ", "%d", xSize );
          if(x.size() > 0) {
            ESP_LOGD("main", "--------------------");
            ESP_LOGD("sent from motor 0x301 x [0]: ", "%d", x[0] ); //rpm
            ESP_LOGD("sent from motor 0x301 x [1]: ", "%d", x[1] ); //rpm
            ESP_LOGD("sent from motor 0x301 x [2]: ", "%d", x[2] ); //SoC
            ESP_LOGD("sent from motor 0x301 x [3]: ", "%d", x[3] ); //amps
            ESP_LOGD("sent from motor 0x301 x [4]: ", "%d", x[4] ); //amps
            ESP_LOGD("sent from motor 0x301 x [5]: ", "%d", x[5] ); //volts
            ESP_LOGD("sent from motor 0x301 x [6]: ", "%d", x[6] ); //volts
            ESP_LOGD("sent from motor 0x301 x [7]: ", "%d", x[7] ); //inverter temp
            // Convert both the integers to string
            std::string byte0 = to_string(x[0]);
            std::string byte1 = to_string(x[1]);
            std::string rpm_str = byte1 + byte0;
            // Convert the concatenated string to integer
            int rpm_int_tmp = atoi(rpm_str.c_str());
            int rpm_int = rpm_int_tmp / 10;
            //ESP_LOGD("newRPM: ", "%d", rpm_int);
            int propeller_int = rpm_int / 2.49;

            //STATE OF CHARGE
            int soc = x[2];
            //ESP_LOGD("soc: %d", soc);

I have tried setting the data to char and string but when converting back to an int, I get the same values so I have stuck with %d.

the only think I can think of that might be causing these problems is the range column in the following image from the netgain hyper9 documents. using voltage as an example, in my configuration I get a 2 and 4, reversed this is 42 volts, BUT the controller and battery says its 96v (which is correct). So this range is not 0 to 100 it is a range.

Any thoughts?