Skip to content

Commit 1751e6f

Browse files
authored
Merge pull request #33 from zestysoft/add-tier-conditions
Add tier conditions
2 parents ae9ce0a + 28a8b28 commit 1751e6f

File tree

3 files changed

+65
-41
lines changed

3 files changed

+65
-41
lines changed

custom_components/sensus_analytics/config_flow.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ async def async_step_user(self, user_input=None) -> FlowResult:
5151
vol.Required(CONF_ACCOUNT_NUMBER): str,
5252
vol.Required(CONF_METER_NUMBER): str,
5353
vol.Required("unit_type", default="CF"): vol.In(["CF", "G"]),
54-
vol.Required("tier1_gallons", default=7480.52): cv.positive_float,
54+
vol.Optional("tier1_gallons", default=None): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
5555
vol.Required("tier1_price", default=0.0128): cv.positive_float,
56-
vol.Required("tier2_gallons", default=7480.52): cv.positive_float,
57-
vol.Required("tier2_price", default=0.0153): cv.positive_float,
58-
vol.Required("tier3_price", default=0.0202): cv.positive_float,
56+
vol.Optional("tier2_gallons", default=None): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
57+
vol.Optional("tier2_price", default=None): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
58+
vol.Optional("tier3_price", default=None): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
5959
vol.Required("service_fee", default=15.00): cv.positive_float,
6060
}
6161
)
@@ -126,26 +126,26 @@ async def async_step_init(self, user_input=None) -> FlowResult:
126126
default=self.config_entry.data.get(CONF_METER_NUMBER),
127127
): str,
128128
vol.Required("unit_type", default=self.config_entry.data.get("unit_type", "CF")): vol.In(["CF", "G"]),
129-
vol.Required(
129+
vol.Optional(
130130
"tier1_gallons",
131-
default=self.config_entry.data.get("tier1_gallons", 7480.52),
132-
): cv.positive_float,
131+
default=self.config_entry.data.get("tier1_gallons", None),
132+
): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
133133
vol.Required(
134134
"tier1_price",
135135
default=self.config_entry.data.get("tier1_price", 0.0128),
136136
): cv.positive_float,
137-
vol.Required(
137+
vol.Optional(
138138
"tier2_gallons",
139-
default=self.config_entry.data.get("tier2_gallons", 7480.52),
140-
): cv.positive_float,
141-
vol.Required(
139+
default=self.config_entry.data.get("tier2_gallons", None),
140+
): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
141+
vol.Optional(
142142
"tier2_price",
143-
default=self.config_entry.data.get("tier2_price", 0.0153),
144-
): cv.positive_float,
145-
vol.Required(
143+
default=self.config_entry.data.get("tier2_price", None),
144+
): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
145+
vol.Optional(
146146
"tier3_price",
147-
default=self.config_entry.data.get("tier3_price", 0.0202),
148-
): cv.positive_float,
147+
default=self.config_entry.data.get("tier3_price", None),
148+
): vol.Any(None, vol.Coerce(float), vol.Range(min=0)),
149149
vol.Required(
150150
"service_fee",
151151
default=self.config_entry.data.get("service_fee", 15.00),

custom_components/sensus_analytics/manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"domain": "sensus_analytics",
33
"name": "Sensus Analytics Integration",
4-
"version": "1.4.6",
4+
"version": "1.4.7",
55
"documentation": "https://github.com/zestysoft/sensus_analytics_integration",
66
"dependencies": [],
77
"codeowners": ["@zestysoft"],

custom_components/sensus_analytics/sensor.py

+48-24
Original file line numberDiff line numberDiff line change
@@ -274,24 +274,36 @@ def native_value(self):
274274

275275
def _calculate_cost(self, usage_gallons):
276276
"""Calculate the billing cost based on tiers and service fee."""
277-
tier1_gallons = self.coordinator.config_entry.data.get("tier1_gallons")
277+
tier1_gallons = self.coordinator.config_entry.data.get("tier1_gallons") or 0
278278
tier1_price = self.coordinator.config_entry.data.get("tier1_price")
279-
tier2_gallons = self.coordinator.config_entry.data.get("tier2_gallons")
280-
tier2_price = self.coordinator.config_entry.data.get("tier2_price")
281-
tier3_price = self.coordinator.config_entry.data.get("tier3_price")
279+
tier2_gallons = self.coordinator.config_entry.data.get("tier2_gallons") or 0
280+
tier2_price = self.coordinator.config_entry.data.get("tier2_price") or 0
281+
tier3_price = self.coordinator.config_entry.data.get("tier3_price") or 0
282282
service_fee = self.coordinator.config_entry.data.get("service_fee")
283283

284284
cost = service_fee
285285
if usage_gallons is not None:
286-
if usage_gallons <= tier1_gallons:
286+
if tier1_gallons == 0:
287+
# No tier 1 limit, all usage is charged at tier 1 price
287288
cost += usage_gallons * tier1_price
288-
elif usage_gallons <= tier1_gallons + tier2_gallons:
289-
cost += tier1_gallons * tier1_price
290-
cost += (usage_gallons - tier1_gallons) * tier2_price
291-
else:
292-
cost += tier1_gallons * tier1_price
293-
cost += tier2_gallons * tier2_price
294-
cost += (usage_gallons - tier1_gallons - tier2_gallons) * tier3_price
289+
elif tier2_gallons == 0:
290+
# No tier 2 limit, calculate for tier 1 and tier 2
291+
if usage_gallons <= tier1_gallons:
292+
cost += usage_gallons * tier1_price
293+
else:
294+
cost += tier1_gallons * tier1_price
295+
cost += (usage_gallons - tier1_gallons) * tier2_price
296+
elif tier3_price > 0:
297+
# Calculate for all three tiers
298+
if usage_gallons <= tier1_gallons:
299+
cost += usage_gallons * tier1_price
300+
elif usage_gallons <= tier1_gallons + tier2_gallons:
301+
cost += tier1_gallons * tier1_price
302+
cost += (usage_gallons - tier1_gallons) * tier2_price
303+
else:
304+
cost += tier1_gallons * tier1_price
305+
cost += tier2_gallons * tier2_price
306+
cost += (usage_gallons - tier1_gallons - tier2_gallons) * tier3_price
295307

296308
return round(cost, 2)
297309

@@ -317,22 +329,34 @@ def native_value(self):
317329

318330
def _calculate_daily_fee(self, usage_gallons):
319331
"""Calculate the daily fee based on tiers."""
320-
tier1_gallons = self.coordinator.config_entry.data.get("tier1_gallons")
332+
tier1_gallons = self.coordinator.config_entry.data.get("tier1_gallons") or 0
321333
tier1_price = self.coordinator.config_entry.data.get("tier1_price")
322-
tier2_gallons = self.coordinator.config_entry.data.get("tier2_gallons")
323-
tier2_price = self.coordinator.config_entry.data.get("tier2_price")
324-
tier3_price = self.coordinator.config_entry.data.get("tier3_price")
334+
tier2_gallons = self.coordinator.config_entry.data.get("tier2_gallons") or 0
335+
tier2_price = self.coordinator.config_entry.data.get("tier2_price") or 0
336+
tier3_price = self.coordinator.config_entry.data.get("tier3_price") or 0
325337

326338
cost = 0
327339
if usage_gallons is not None:
328-
if usage_gallons <= tier1_gallons:
340+
if tier1_gallons == 0:
341+
# No tier 1 limit, all usage is charged at tier 1 price
329342
cost += usage_gallons * tier1_price
330-
elif usage_gallons <= tier1_gallons + tier2_gallons:
331-
cost += tier1_gallons * tier1_price
332-
cost += (usage_gallons - tier1_gallons) * tier2_price
333-
else:
334-
cost += tier1_gallons * tier1_price
335-
cost += tier2_gallons * tier2_price
336-
cost += (usage_gallons - tier1_gallons - tier2_gallons) * tier3_price
343+
elif tier2_gallons == 0:
344+
# No tier 2 limit, calculate for tier 1 and tier 2
345+
if usage_gallons <= tier1_gallons:
346+
cost += usage_gallons * tier1_price
347+
else:
348+
cost += tier1_gallons * tier1_price
349+
cost += (usage_gallons - tier1_gallons) * tier2_price
350+
elif tier3_price > 0:
351+
# Calculate for all three tiers
352+
if usage_gallons <= tier1_gallons:
353+
cost += usage_gallons * tier1_price
354+
elif usage_gallons <= tier1_gallons + tier2_gallons:
355+
cost += tier1_gallons * tier1_price
356+
cost += (usage_gallons - tier1_gallons) * tier2_price
357+
else:
358+
cost += tier1_gallons * tier1_price
359+
cost += tier2_gallons * tier2_price
360+
cost += (usage_gallons - tier1_gallons - tier2_gallons) * tier3_price
337361

338362
return round(cost, 2)

0 commit comments

Comments
 (0)