Make Chargepoint.power nullable

Not all data sources provide power for all connectors (e.g.
OpenChargeMap and OpenStreetMap don't always). Even without the power
level, knowing what connectors there are is still useful.
This commit is contained in:
Danilo Bargen
2022-01-27 00:34:26 +01:00
parent f591829cb5
commit 85bf04504b
6 changed files with 44 additions and 24 deletions

View File

@@ -86,7 +86,7 @@ abstract class BaseAvailabilityDetector(private val client: OkHttpClient) : Avai
// find corresponding powers in GE data
val gePowers =
chargepoints.filter { equivalentPlugTypes(it.type).any { it == type } }
.map { it.power }.distinct().sorted()
.mapNotNull { it.power }.distinct().sorted()
// if the distinct number of powers is the same, try to match.
if (powers.size == gePowers.size) {
@@ -131,7 +131,7 @@ data class ChargeLocationStatus(
(connectors == null || connectors.map {
equivalentPlugTypes(it)
}.any { equivalent -> it.type in equivalent })
&& (minPower == null || it.power > minPower)
&& (minPower == null || (it.power != null && it.power > minPower))
}
return this.copy(status = statusFiltered)
}

View File

@@ -48,11 +48,9 @@ data class ChargepriceStation(
charger.coordinates.lat,
charger.chargepriceData.country,
charger.chargepriceData.network,
charger.chargepoints.zip(plugTypes).filter {
equivalentPlugTypes(it.first.type).any { it in compatibleConnectors }
}.map {
ChargepriceChargepoint(it.first.power, it.second)
}
charger.chargepoints.zip(plugTypes)
.filter { equivalentPlugTypes(it.first.type).any { it in compatibleConnectors } }
.map { ChargepriceChargepoint(it.first.power ?: 0.0, it.second) }
)
}
}

View File

@@ -141,7 +141,7 @@ data class OCMConnection(
) {
fun convert(refData: OCMReferenceData) = Chargepoint(
convertConnectionTypeFromOCM(connectionTypeId, refData),
power ?: 0.0,
power,
quantity ?: 1
)

View File

@@ -64,7 +64,7 @@ data class ChargeLocation(
/**
* maximum power available from this charger.
*/
val maxPower: Double
val maxPower: Double?
get() {
return maxPower()
}
@@ -72,17 +72,20 @@ data class ChargeLocation(
/**
* Gets the maximum power available from certain connectors of this charger.
*/
fun maxPower(connectors: Set<String>? = null): Double {
return chargepoints.filter { connectors?.contains(it.type) ?: true }
.map { it.power }.maxOrNull() ?: 0.0
fun maxPower(connectors: Set<String>? = null): Double? {
return chargepoints
.filter { connectors?.contains(it.type) ?: true }
.mapNotNull { it.power }
.maxOrNull()
}
fun isMulti(filteredConnectors: Set<String>? = null): Boolean {
var chargepoints = chargepointsMerged
.filter { filteredConnectors?.contains(it.type) ?: true }
if (maxPower(filteredConnectors) >= 43) {
val chargepointMaxPower = maxPower(filteredConnectors)
if (chargepointMaxPower != null && chargepointMaxPower >= 43) {
// fast charger -> only count fast chargers
chargepoints = chargepoints.filter { it.power >= 43 }
chargepoints = chargepoints.filter {it.power != null && it.power >= 43 }
}
val connectors = chargepoints.map { it.type }.distinct().toSet()
@@ -306,9 +309,24 @@ data class Address(
@Parcelize
@JsonClass(generateAdapter = true)
data class Chargepoint(val type: String, val power: Double, val count: Int) : Equatable,
Parcelable {
fun formatPower(): String {
data class Chargepoint(
// The chargepoint type (use one of the constants in the companion object)
val type: String,
// Power in kW (or null if unknown)
val power: Double?,
// How many instances of this plug/socket are available?
val count: Int,
) : Equatable, Parcelable {
fun hasKnownPower(): Boolean = power != null
/**
* If chargepoint power is defined, format it into a string.
* Otherwise, return null.
*/
fun formatPower(): String? {
if (power == null) {
return null
}
val powerFmt = if (power - power.toInt() == 0.0) {
"%.0f".format(power)
} else {

View File

@@ -13,12 +13,16 @@ import kotlin.math.max
fun getMarkerTint(
charger: ChargeLocation,
connectors: Set<String>? = null
): Int = when {
charger.maxPower(connectors) >= 100 -> R.color.charger_100kw
charger.maxPower(connectors) >= 43 -> R.color.charger_43kw
charger.maxPower(connectors) >= 20 -> R.color.charger_20kw
charger.maxPower(connectors) >= 11 -> R.color.charger_11kw
else -> R.color.charger_low
): Int {
val maxPower = charger.maxPower(connectors)
return when {
maxPower == null -> R.color.charger_low
maxPower >= 100 -> R.color.charger_100kw
maxPower >= 43 -> R.color.charger_43kw
maxPower >= 20 -> R.color.charger_20kw
maxPower >= 11 -> R.color.charger_11kw
else -> R.color.charger_low
}
}
class MarkerAnimator(val gen: ChargerIconGenerator) {