Files
JIMRI/jython/SampleLnStats.py
2026-06-17 14:00:51 +02:00

139 lines
4.8 KiB
Python

# This is script for samples the LocoNet statistics
# once per minute and prints them out
#
# Author: Bob Jacobsen, copyright 2004
# Author: B. Milhaupt, copyright 2017
# Part of the JMRI distribution
# make the jmri libraries easily availble
import jmri
import java
import java.util
class SampleLnStats(jmri.jmrit.automat.AbstractAutomaton) :
# init() is called exactly once at the beginning to do
# any necessary configuration.
def init(self):
self.lastReceivedMsgs = 0
self.lastReceivedBytes = 0
self.lastTransmittedMsgs = 0
self.lastBreaks = -1
self.lastErrors = -1
self.errors = 0
self.breaks = 0
# get the LocoNet connection (the first of potentially several LocoNet connections)
myLocoNetConnection = jmri.InstanceManager.getList(jmri.jmrix.loconet.LocoNetSystemConnectionMemo).get(0);
# create LocoStatsFunc instance
self.monitor = jmri.jmrix.loconet.locostats.LocoStatsFunc(myLocoNetConnection)
# create a listener for LocoNet Status events
myLocoStatsListener = MyListener()
# add the listener
self.monitor.addLocoNetInterfaceStatsListener(myLocoStatsListener)
# get the slot manager instance and traffic controller instance, for use later
self.slotManager = myLocoNetConnection.getSlotManager()
self.trafficController = myLocoNetConnection.getLnTrafficController()
return
# define how long to wait between samples (in seconds)
#
# If you want to change the sample interval,
# just change the delay variable here
delay = 15
# define the filename used for the output file
filename = 'LocoNetStatsSamples'
# handle() is called repeatedly until it returns false.
#
# In this case, it prints a line each time around
def handle(self):
# request the current error counts
self.monitor.sendLocoNetInterfaceStatusQueryMessage()
self.waitMsec(1000)
nowErrors = self.errors;
nowBreaks = self.breaks;
# if the LocoBuffer wasn't read, that's a special case
if ( nowErrors == -1 or self.lastErrors == -1) :
delErrors = -1
else :
delErrors = nowErrors - self.lastErrors
if ( nowBreaks == -1 or self.lastBreaks == -1) :
delBreaks = -1
else :
delBreaks = nowBreaks - self.lastBreaks
# get the current values for traffic
nowReceivedMsgs = self.trafficController.getReceivedMsgCount()
nowReceivedBytes = self.trafficController.getReceivedByteCount()
nowTransmittedMsgs = self.trafficController.getTransmittedMsgCount()
# get the current values for slots in use
nowSlotsUsed = self.slotManager.getInUseCount()
# calculate changes
delReceivedMsgs = nowReceivedMsgs - self.lastReceivedMsgs
delReceivedBytes = nowReceivedBytes - self.lastReceivedBytes
delTransmittedMsgs = nowTransmittedMsgs - self.lastTransmittedMsgs
self.lastReceivedMsgs = nowReceivedMsgs
self.lastReceivedBytes = nowReceivedBytes
self.lastTransmittedMsgs = nowTransmittedMsgs
self.lastErrors = nowErrors
self.lastBreaks = nowBreaks
date = java.util.Date().toString()
# convert numbers to a single output string in the CSV format
result = ''+date+','+str(delReceivedMsgs)+','+str(delReceivedBytes)+','+str(delTransmittedMsgs)+','+str(nowSlotsUsed)+','+str(delBreaks)+','+str(delErrors)
print result
# also open the file for appending, append the line, and close
f = open(self.filename, "a")
f.write(result+'\n')
f.close()
# wait to do next sample ( 1 second was used in the error count)
self.waitMsec((self.delay-2)*1000)
# and continue around again
return 1 # to continue
# end of class definition
class MyListener(jmri.jmrix.loconet.locostats.LocoNetInterfaceStatsListener):
# a listener for LocoNet status information events
def notifyChangedInterfaceStatus(self, o) :
if (o.class == jmri.jmrix.loconet.locostats.PR3MS100ModeStatus):
# PR3 does not provide a count of breaks
# PR3 provides "bad message count", which we equate with "errors"
self.errors = o.badMsgCnt
elif (o.class == jmri.jmrix.loconet.locostats.LocoBufferIIStatus):
#locoBufferII and LocoBuffer-USB provide "errors" and "breaks"
self.errors = o.errors
self.breaks = o.breaks
# NOTE: other interface types apparantly do not provide useful information
# end of class definition
# create one of these
a = SampleLnStats()
# you can change the filename used
# a.filename = 'BetterName.foo'
# set the name, so you see it to cancel it
a.setName("Sample LocoNet Statistics")
# and start it running
a.start()