I’ve written part of the code. It collects the raw stats from all the modems, parses it crudely and pulls out ES up/down records, then converts these numbers into ES per hr so the ES rates are normalised. In my code, it refers to one of the, say, 15 min (or less) ES-counting periods, or up-to-24hr periods, as “buckets”.
Here’s some of the debugging output it produces:
FEC: 6 5
CRC: 0 0
ES: 0 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[1]; bucket=[Latest 15 minutes time]; dir=[down]; ES_count=[0]; bucket duration =[308]; ES/hr = [0]
modem=[1]; bucket=[Latest 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[308]; ES/hr = [0]
FEC: 27 49
CRC: 0 0
ES: 0 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[1]; bucket=[Previous 15 minutes time]; dir=[down]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
modem=[1]; bucket=[Previous 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
FEC: 104 49
CRC: 0 0
ES: 0 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[2]; bucket=[Latest 15 minutes time]; dir=[down]; ES_count=[0]; bucket duration =[323]; ES/hr = [0]
modem=[2]; bucket=[Latest 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[323]; ES/hr = [0]
FEC: 304 59
CRC: 0 0
ES: 0 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[2]; bucket=[Previous 15 minutes time]; dir=[down]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
modem=[2]; bucket=[Previous 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
FEC: 11 0
CRC: 0 0
ES: 0 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[3]; bucket=[Latest 15 minutes time]; dir=[down]; ES_count=[0]; bucket duration =[127]; ES/hr = [0]
modem=[3]; bucket=[Latest 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[127]; ES/hr = [0]
FEC: 98 13
CRC: 0 0
ES: 0 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[3]; bucket=[Previous 15 minutes time]; dir=[down]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
modem=[3]; bucket=[Previous 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
FEC: 11358 80
CRC: 3 0
ES: 3 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[4]; bucket=[Latest 15 minutes time]; dir=[down]; ES_count=[3]; bucket duration =[305]; ES/hr = [35.40983606557377]
modem=[4]; bucket=[Latest 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[305]; ES/hr = [0]
FEC: 31316 241
CRC: 11 0
ES: 11 0
SES: 0 0
UAS: 0 0
LOS: 0 0
LOF: 0 0
LOM: 0 0
modem=[4]; bucket=[Previous 15 minutes time]; dir=[down]; ES_count=[11]; bucket duration =[900]; ES/hr = [44]
modem=[4]; bucket=[Previous 15 minutes time]; dir=[up]; ES_count=[0]; bucket duration =[900]; ES/hr = [0]
--
{"modem":1,"bucket label in stats":"Latest 15 minutes time","dir":"down","ES per hr":0}
{"modem":1,"bucket label in stats":"Latest 15 minutes time","dir":"up","ES per hr":0}
{"modem":1,"bucket label in stats":"Previous 15 minutes time","dir":"down","ES per hr":0}
{"modem":1,"bucket label in stats":"Previous 15 minutes time","dir":"up","ES per hr":0}
{"modem":2,"bucket label in stats":"Latest 15 minutes time","dir":"down","ES per hr":0}
{"modem":2,"bucket label in stats":"Latest 15 minutes time","dir":"up","ES per hr":0}
{"modem":2,"bucket label in stats":"Previous 15 minutes time","dir":"down","ES per hr":0}
{"modem":2,"bucket label in stats":"Previous 15 minutes time","dir":"up","ES per hr":0}
{"modem":3,"bucket label in stats":"Latest 15 minutes time","dir":"down","ES per hr":0}
{"modem":3,"bucket label in stats":"Latest 15 minutes time","dir":"up","ES per hr":0}
{"modem":3,"bucket label in stats":"Previous 15 minutes time","dir":"down","ES per hr":0}
{"modem":3,"bucket label in stats":"Previous 15 minutes time","dir":"up","ES per hr":0}
{"modem":4,"bucket label in stats":"Latest 15 minutes time","dir":"down","ES per hr":35.40983606557377}
{"modem":4,"bucket label in stats":"Latest 15 minutes time","dir":"up","ES per hr":0}
{"modem":4,"bucket label in stats":"Previous 15 minutes time","dir":"down","ES per hr":44}
{"modem":4,"bucket label in stats":"Previous 15 minutes time","dir":"up","ES per hr":0}
--
Severely bad (>=60ES / hr):
--
Non-zero:
{"modem":4,"bucket label in stats":"Latest 15 minutes time","dir":"down","ES per hr":35.40983606557377}
{"modem":4,"bucket label in stats":"Previous 15 minutes time","dir":"down","ES per hr":44}
Currently the program looks only at the two most recent 15 min (max) duration buckets, and doesn’t inspect the longer eg. 24-hour ones. I think I should do something about this. I had initially thought that "most recent is most relevant" but now I’m having my doubts. What do you think?
It has already proven its worth because it has detected a problem with line 4; the downstream SNRM is down to ~1.4 dB which appears to be a bad thing. You can see the problem in the ES downstream for line 4.
I need to distill the output down further as well, producing an additional summary that clearly shows an “action vs no action” indicator to the user, plus individual warning light-type indicators per modem. I could do with some guidance on this. Anyone up for helping me out?