You are here

Zenus - The Zen ADSL Usage Monitor

Zenus is a Perl interface to the Zen ADSL usage web service.

It features:

  1. A Perl module ( to handle the actual communication to the web service that can also be used to build your own custom interfaces
  2. Two example front ends to the module - the main script and a debugging client

Zenus is ideal if you want to integrate 3rd party monitoring systems like Cacti (which used Zenus to produce the attached graph) or if you run Linux and don't or can't make use of the cross-platform Firefox plug-in.

Zenus v2 now longer works due to changes at Zen

A version 3 is in early testing. Please contact me if you want to test it.




Amazing work here - EXACTLY what I was looking for since switching to the Zen 8000 Active package yesterday!

I've also just started using Cacti on my router. Is there any chance you could guide me as to how you attached it to using Zenus?

Great work!


I'm actually slowly getting it to work with Cacti and I now have it logging everything into Cacti and drawing a pretty graph. I'd quite like to get it packaged into a template for Cacti though - have you thought about doing that? I might package mine and release it... might go nicely with Zenus...

I'd certainly take a look and maybe add it to the Zenus distribution / web page.

I've been meaning to do it myself (to show you how to go from the Perl to the graph on this page), but I've not got round to putting all the output's into the data source yet.

Send me what you have ;-)


Yep, sure thing, I'll send it over later. Where do you want me to send it to?

I've got mine logging usage, available, estimated current month and total cap at the moment. It's simple to add in the structure for the other variables which come from Zenus.

My email address is in the README file in the distribution, or use my username (or name from the footer of comments) @ the domain of this web page (minus the www., if present).


Just installed zenus and all required modules, but I get this error message when I run with my portal username and password:

500 Can't connect to (Illegal seek) at line 141

How to fix this?


Odd error that.
Please let me have the output of using '', your Linux distribution name and version and your Perl version.

(edit the following Monday)Fixed by making sure Crypt::SSLeay is installed. README updated.



Am preparing a simple script based on your work for use with Munin and as part of this, Munin calls a version of your Perl script via a soft link.

I get an answer but seem to have unlocked some warning messages from and I also found one (corrected) in

Error strings are:
martin@mended-drum:/usr/local/lib/site_perl$ munin-run zenin
Use of uninitialized value $name in substitution (s///) at /usr/local/share/perl/5.10.0/SOAP/ line 1055.
Use of uninitialized value $name in exists at /usr/local/share/perl/5.10.0/SOAP/ line 1056.
Use of uninitialized value $name in hash element at /usr/local/share/perl/5.10.0/SOAP/ line 1056.
Use of uninitialized value $name in hash element at /usr/local/share/perl/5.10.0/SOAP/ line 1060.
Use of uninitialized value $name in hash element at /usr/local/share/perl/5.10.0/SOAP/ line 1060.


But I do get the right answer at the end:
Available.value 26.3388671875
Remaining.value 12.9140625
Used.value 13.4248046875

The 'correction' in was on line 336. I believe the code snippet
print "accounts $1 $2 $3 ... \n" unless $hideDebug;

my $result;
push @result,$1;
push @result,$2;

should read
print "accounts $1 $2 $3 ... \n" unless $hideDebug;

my @result; push @result,$1;
push @result,$2;

Any chance you can point me in the right direction here? Happy to share code and stuff - and to contribute my code and set up instructions to your site if it all works.

Best Regards

Good spot on the $result mistake :-)

At a guess, your code is running using 'perl -w' which will spit out all sorts of warnings. Remove the -w to stop them appearing.


your month indexes are off by one, in sub estimateRemaining the calculation for days in months should be the following


if (($month == 3) || ($month == 5) || ($month == 8) || ($month == 10)) {
                $length = 30;
        }elsif($month == 1 && _isLeapYear($year)) {
                $length = 29;
        }elsif ($month == 1) {
                $length = 28;
        } else {
                $length = 31;


as the return mon entry in localtime is 0 january, 1 for febuary and so on


topical-homopterousif you are reading this, don't click it as it will mark you as a spammer
if you are reading this, don't click it as it will mark you as a spammer