The toner report says what is empty now. It could not say what to order, and nothing recorded how fast anything drains - every level read was cached for five minutes and then discarded. Zabbix has been keeping the history all along; we simply never asked. One history.get gives both answers, because a cartridge only goes DOWN while it is in use: a rise is a replacement. Count the rises and you have how many cartridges a printer has been through; fit a slope to the readings SINCE the last rise and you have days-to-empty. Fitting across a replacement averages a spent cartridge with a fresh one and describes neither. Sorted by days left, which is the point. A cartridge at 60% dropping 5% a day needs ordering before one sitting at 8% that has not moved in months, and a level-sorted list ranks those backwards. It refuses to guess. Too few readings, a level that has not moved enough - many printers report in 10% steps and sit on a plateau for a fortnight - or a recent replacement each produce no estimate and say which. Those printers are listed separately rather than sorted in as 0 or as 999, since a printer without an estimate is neither urgent nor safe. Estimates show what they rest on, because "9 days from 21 days of readings" and "9 days from 2 readings" are not the same claim. A separate report card, not an extension of the toner report: that one is an exceptions list a tech acts on today, this is an ordering view read monthly, and the history query is heavier than the live read it would have slowed down. The analysis is pure arithmetic over a list of readings, so the 14 tests cover the noise wobble, the plateau, the swap, junk rows and division by zero without needing Zabbix. Zabbix being unreachable is reported as such rather than rendering an empty table that reads as "nothing is due".
27 lines
538 B
Python
27 lines
538 B
Python
"""Printers plugin services."""
|
|
|
|
from .zabbix_service import ZabbixService
|
|
from .supply_parts import (
|
|
classifysupply,
|
|
derivesupplytype,
|
|
derivecolor,
|
|
lookupsupplies,
|
|
alerttier,
|
|
)
|
|
from .supply_alerts import check_supplies
|
|
from .supply_history import analyse, soonest
|
|
from .seed_supplies import seedsupplies
|
|
|
|
__all__ = [
|
|
'ZabbixService',
|
|
'classifysupply',
|
|
'derivesupplytype',
|
|
'derivecolor',
|
|
'lookupsupplies',
|
|
'alerttier',
|
|
'check_supplies',
|
|
'analyse',
|
|
'soonest',
|
|
'seedsupplies',
|
|
]
|