Was not happy with the behaviour I was seeing on CAN msg 0x5bc and the GIDs, Battery Energy Available and SOC_newcar we are deriving from them. For some reason it was randomly either show the expected value, and at other times would go to gids=375. Note that gids=375 is a special number: energy = gids * GEN_1_WH_PER_GID = 375 * 80 = 30 kwh !!! So I decided to trace more info on this CAN msg in my 30kwh leaf. Conclusion: - nl_gids actually toggles between current_gids and max_gids - d[5] & 0x10 is the flag that indicates which of these two is in the current message. So on a 30kwh leaf we can derive m_gids, m_battery_energy_available AND m_battery_energy_capacity all from the 0x5bc message! Am still running a trace on 0x59e to see what the exact behaviour there is, but probably we can ignore that message for the 30kwh model. Below trace results show: - d[0]...d[7] raw values, - xm is a typo for the mx multiplexer variable as used for the estimated charge time (d[5] and d[6]) - cur_gids is the nl_gids value (d[0] and d[1]) - exp_gids is an indication of expected gids: 375 * SOC / 100 (without taking SOH into account) - SOC is soc_instrument. During charging: V (3689688) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 78 b7 10 1f ff, xm=0 cur_gids=375 exp_gids=131 soc= 35%[0m V (3689788) v-nissanleaf: CAN1 0x5bc = 1d 80 f0 78 b7 00 a0 f0, xm=5 cur_gids=118 exp_gids=131 soc= 35%[0m V (3689888) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 78 b7 11 03 2a, xm=8 cur_gids=375 exp_gids=131 soc= 35%[0m V (3689988) v-nissanleaf: CAN1 0x5bc = 1d 80 f0 78 b7 01 64 92, xm=11 cur_gids=118 exp_gids=131 soc= 35%[0m V (3690088) v-nissanleaf: CAN1 0x5bc = 5d c0 50 78 b6 12 5f ff, xm=18 cur_gids=375 exp_gids=131 soc= 35%[0m V (3690188) v-nissanleaf: CAN1 0x5bc = 1d 80 50 78 b6 02 bf ff, xm=21 cur_gids=118 exp_gids=131 soc= 35%[0m V (3690288) v-nissanleaf: CAN1 0x5bc = 5d c0 50 78 b6 13 1f ff, xm=24 cur_gids=375 exp_gids=131 soc= 35%[0m .. and so on with cur_gids=118 and SOC slowly climbing During driving: V (338837) v-nissanleaf: CAN1 0x5bc = 4d 00 f0 64 b7 00 1f ff, xm=0 cur_gids=308 exp_gids=348 soc= 93%[0m V (338937) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 64 b7 10 a0 3c, xm=5 cur_gids=375 exp_gids=348 soc= 93%[0m V (339037) v-nissanleaf: CAN1 0x5bc = 4d 00 f0 64 b7 01 00 96, xm=8 cur_gids=308 exp_gids=348 soc= 93%[0m V (339137) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 64 b7 11 60 d2, xm=11 cur_gids=375 exp_gids=348 soc= 93%[0m V (339237) v-nissanleaf: CAN1 0x5bc = 4d 00 f0 64 b7 02 5f ff, xm=18 cur_gids=308 exp_gids=348 soc= 93%[0m V (339337) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 64 b6 12 bf ff, xm=21 cur_gids=375 exp_gids=348 soc= 93%[0m V (339437) v-nissanleaf: CAN1 0x5bc = 4d 00 f0 64 b6 03 1f ff, xm=24 cur_gids=308 exp_gids=348 soc= 93%[0m .. and so on with cur_gids=308 and SOC slowly decreasing Parked overnight: V (14108065) v-nissanleaf: CAN1 0x5bc = 5d c0 8c 64 b6 10 1f ff, xm=0 cur_gids=375 exp_gids=206 soc= 55%[0m V (14108165) v-nissanleaf: CAN1 0x5bc = 2d 80 8c 64 b6 00 a0 b4, xm=5 cur_gids=182 exp_gids=206 soc= 55%[0m V (14108265) v-nissanleaf: CAN1 0x5bc = 5d c0 8c 64 b6 11 02 58, xm=8 cur_gids=375 exp_gids=206 soc= 55%[0m V (14108365) v-nissanleaf: CAN1 0x5bc = 2d 80 f0 64 b7 01 63 66, xm=11 cur_gids=182 exp_gids=206 soc= 55%[0m V (14108465) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 64 b7 12 5f ff, xm=18 cur_gids=375 exp_gids=206 soc= 55%[0m V (14108575) v-nissanleaf: CAN1 0x5bc = 2d 80 f0 64 b7 02 bf ff, xm=21 cur_gids=182 exp_gids=206 soc= 55%[0m V (14108675) v-nissanleaf: CAN1 0x5bc = 5d c0 f0 64 b7 13 1f ff, xm=24 cur_gids=375 exp_gids=206 soc= 55%[0m ... and so on with no changes to cur_gids and SOC So improved handler code for the 0x5bc message should be something like: if (nl_gids != 1023) { if ( (m_battery_type->AsInt(BATTERY_TYPE_2_24kWh) == BATTERY_TYPE_2_30kWh) && // <-- Not sure if we need this or if d[5] & 0x10 is always 0 anyway on older models ???? (d[5] & 0x10 == 0x10) ) { m_battery_energy_capacity->SetValue(nl_gids * GEN_1_WH_PER_GID, WattHours); } else { m_gids->SetValue(nl_gids); m_battery_energy_available->SetValue(nl_gids * GEN_1_WH_PER_GID, WattHours); // new car soc -- 100% when the battery is new, less when it's degraded uint16_t max_gids = MyConfig.GetParamValueInt("xnl", "maxGids", GEN_1_NEW_CAR_GIDS); float soc_new_car = (nl_gids * 100.0) / max_gids; m_soc_new_car->SetValue(soc_new_car); // we use the instrument cluster soc from 0x1db unless the user has opted otherwise if (MyConfig.GetParamValueBool("xnl", "soc.newcar", false)) { StandardMetrics.ms_v_bat_soc->SetValue(soc_new_car); } } }