Energiemeters monitoren met Nagios

Last Updated on 20 juli 2021 by Syds

Na een tijdje data te hebben verzameld van mijn energiemeters/sensors, zoals de:

kwam ik bij analyse van die data er achter dat sommige sensoren soms niet goed werken en minder data verzamelen dan gebruikelijk. Dit gedrag zag ik met name bij het uitlezen van het gebruik van de Laadpaal (Eastron sdm120m kWh meter i.c.m. een FT232RL-adapter), maar ook bij het uitlezen van één van de inverters van mijn Zonnepanelen.

Om dit te monitoren heb ik Nagios uitgebreid met het monitoren van het aantal records welke per sensor in de database verwerkt worden.

Hiervoor heb ik een view aan de database toegevoegd welke het aantal waarnemingen per sensor per dag weergeeft, de huidige dag uitgesloten. Vervolgens een plugin die een query kan uitvoeren op de database toegevoegd aan Nagios. En uiteraard de configuratie van Nagios dusdanig aangepast dat hij een waarschuwing afgeeft als een sensor minder waarnemingen registreert dan gebruikelijk.

links:

  • https://github.com/harisekhon/nagios-plugins

Benodigdheden

  • geen

Reeds geïnstalleerd en up-and-running:

  • MariaDB database
  • Nagios
  • Perl
  • Enkele sensoren die energie, water en/of gas metingen registreren in de MariaDB database

Stap 1. View Energy_status gemaakt

Deze view telt het aantal waarnemingen per sensor per dag, en sorteert die van laatste dag naar eerste dag (descending). Dit laatste omdat de Nagios plugin alleen het eerste record uitleest. De huidige, lopende dag is uitgesloten omdat daarvan het totale aantal waarnemingen nog niet bekend is. Dit betekent wel dat de eventuele waarschuwingen van vandaag gaan over de waarnemingen van gisteren !

CREATE 
     ALGORITHM = UNDEFINED 
     DEFINER = root@% 
     SQL SECURITY DEFINER
 VIEW Energy_status AS
     SELECT 
         CAST(a.sample datetime AS DATE) AS Datum,
         COUNT(0) AS Slimme meter,
         (SELECT 
                 COUNT(0)
             FROM
                 laadpaal b
             WHERE
                 CAST(b.sample datetime AS DATE) = CAST(a.sample datetime AS DATE)) AS Laadpaal,
         (SELECT 
                 COUNT(0)
             FROM
                 watermeter c
             WHERE
                 CAST(c.sample datetime AS DATE) = CAST(a.sample datetime AS DATE)) AS Watermeter,
         (SELECT 
                 COUNT(0)
             FROM
                 pv d
             WHERE
                 CAST(d.sample datetime AS DATE) = CAST(a.sample datetime AS DATE)
                     AND d.inverter = 1) AS Inverter 1,
         (SELECT 
                 COUNT(0)
             FROM
                 pv e
             WHERE
                 CAST(e.sample datetime AS DATE) = CAST(a.sample datetime AS DATE)
                     AND e.inverter = 2) AS Inverter 2
     FROM
         slimme_meter a
     WHERE
         CAST(a.sample datetime AS DATE) <> CAST(CURRENT_TIMESTAMP() AS DATE)
     GROUP BY DATE_FORMAT(a.sample datetime, '%Y%m%d')
     ORDER BY CAST(a.sample datetime AS DATE) DESC

Als je view bevraagd met

SELECT * FROM energy.Energy_status;

Krijg je het volgende resultaat:

Stap 2. Nagios plugin check_mysql_query geïnstalleerd

Voor het monitoren van de waarnemingen in de MariaDB database gebruik ik de check_mysql_query plugin van Hari Sekhon. Meer info op https://github.com/harisekhon/nagios-plugins

Deze plugin is geschreven in Perl. De huidige versie van Raspbian heeft standaard Perl aan boord. Mocht je twijfelen, voer dat het commando perl -v uit. Is Perl nog niet geinstalleerd, installeer Perl dan met: sudo apt-get install perl

Installeer de plugin:

cd /usr/local/nagios/libexec
sudo wget https://raw.githubusercontent.com/HariSekhon/Nagios-Plugins/master/check_mysql_query.pl
sudo chmod 755 check_mysql_quiry.pl

sudo wget https://raw.githubusercontent.com/HariSekhon/lib/cb3057ccda42f5de6cc0180aa9ff6e600075402f/HariSekhonUtils.pm
sudo chmod 755 HariSekhonUtils.pm
sudo ln -s /usr/local/nagios/libexec/HariSekhonUtils.pm /etc/perl/HariSekhonUtils.pm

sudo mkdir /etc/perl/resources
cd /etc/perl/resources
sudo wget https://raw.githubusercontent.com/HariSekhon/lib/cb3057ccda42f5de6cc0180aa9ff6e600075402f/resources/tlds-alpha-by-domain.txt 

sudo cpan JSON # Kies voor standaard configuratie door op yes te klikken

Test de plugin met:

cd /usr/local/nagios/libexec
./check_mysql_query.pl -H localhost -P 3306 -u <user> -p <password> -d <database> -q 'SELECT * FROM energy.Energy_status' -f 1

Als alles goed geinstalleerd is, krijg het volgende resultaat terug:

OK: query returned '288' | mysql_query_time=4.9049s

Stap 3. Nagios configureren

Eerst de check_mysql_query plugin toegevoegd aan /usr/local/nagios/etc/objects/commands.cfg

#########################################################
# NOTE:  The following 'check_…' commands are used to monitor services on
# both local and remote hosts.
#########################################################

define command {
     command_name    check_mysql_query
     command_line    $USER1$/check_mysql_query.pl -H localhost -P 3306 -u <user> -p <password> -d energy -q 'SELECT * FROM energy.Energy_status' -f $ARG1$ -Q -T -c $ARG2$ -l $ARG3$
 }

Vervolgens per sensor een service description toegevoegd aan /usr/local/nagios/etc/ojbects/sensor.cfg (Ik heb alle sensoren ondergebracht in de file sensor.cfg, je kunt uiteraard ze ook toevoegen aan een andere willekeurige configuratie file)

Eerst de host aangemaakt:

########################################
#
# HOST DEFINITION
#
########################################

define host {
      use                     sensor                  ; Name of host template to use 
      hostname                espressif.sydspost.nl 
      display_name            HomeWizard_dongle
 ;    address                 192.168.2.140
      contacts                nagiosadmin
      check_interval          1440
 }

Note: Heb er voor gekozen om alle sensors “op te hangen” aan de HomeWizard dongle die de slimme meter uitleest. Deze heeft standaard de DNS naam ‘espressif’, dus de FQN is espressif.sydspost.nl

Daarna de Hostgroup uitgebreid met de host espressif:

########################################
#
# HOSTGROUP DEFINITION
#
########################################

define hostgroup {


    hostgroup_name          Sensors                 ; The name of the hostgroup 
    alias                   Sensors                 ; Long name of the group 
    members                 wifi-thermometer.sydspost.nl, espressif.sydspost.nl              ; Comma separated list of hosts that belong to this group
}

Tot slot de services toegevoegd voor elk van de sensors:

define service {
     use                     local-service
     host_name               espressif.sydspost.nl
     service_description     HTTP
     check_command           check_http! -u http://espressif.sydspost.nl/api/v1/data
 }
 define service {
     use                     generic-service
     host_name               espressif.sydspost.nl
     service_description     Slimme meter
     check_command           check_mysql_query!2!280:300!Slimme Meter
 }
 define service {
     use                     generic-service
     host_name               espressif.sydspost.nl
     service_description     Laadpaal
     check_command           check_mysql_query!3!20:30!Laadpaal
 }
 define service {
     use                     generic-service
     host_name               espressif.sydspost.nl
     service_description     Inverter 1
     check_command           check_mysql_query!5!270:300!Inverter 1
 }
 define service {
     use                     generic-service
     host_name               espressif.sydspost.nl
     service_description     Inverter 2
     check_command           check_mysql_query!6!180:210!Inverter 2
 }
Sensorcheck_commandToelichting
Slimme metercheck_mysql_query!2!280:300!Slimme Meter2: Tweede veld uit de query bevat het aantal waarnemingen van de sensor Slimme meter
280:300: de bandbreedte voor het normaal aantal waarnemingen op een dag = 60/5 * 24 = 288 (uitgaand van om de 5 minuten een waarneming)
Slimme meter: Zinvolle naam
Laadpaalcheck_mysql_query!3!20:30!Laadpaal3: Derde veld uit de query bevat het aantal waarnemingen van de sensor Laadpaal
20:30: de bandbreedte voor het normaal aantal waarnemingen op een dag = 24 (uitgaand van om ieder uur een waarneming)
Laadpaal: Zinvolle naam
Inverter 1check_mysql_query!5!270:300!Inverter 15: Vijfde veld uit de query bevat het aantal waarnemingen van Inverter 1
270:300: de bandbreedte voor het normaal aantal waarnemingen op een dag = 60/5 * 24 = 288 (uitgaand van om de 5 minuten een waarneming)
Inverter 1: Zinvolle naam
Inverter 2check_mysql_query!6!180:210!Inverter 26: Zesde veld uit de query bevat het aantal waarnemingen van Inverter 2
180:210: de bandbreedte voor het normaal aantal waarnemingen op een dag (Deze inverter geeft geen waarden als de zon onder dus, dus op basis van data analyse deze bandbreedte gekozen)
Inverter 2: Zinvolle naam

Daarna de configuratie gecheckt met: sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

pi@raspberrypi:/usr/local/nagios/etc/objects $ sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
 Nagios Core 4.4.6
 Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
 Copyright (c) 1999-2009 Ethan Galstad
 Last Modified: 2020-04-28
 License: GPL
 Website: https://www.nagios.org
 Reading configuration data…
    Read main config file okay…
    Read object config files okay…
 Running pre-flight check on configuration data…
 Checking objects…
 Warning: Service 'PING' on host 'HPF43909564C83.sydspost.nl'  has a notification interval less than its check interval!  Notifications are only re-sent after checks are made, so the effective notification interval will be that of the check interval.
 Warning: Service 'PING' on host 'canon.sydspost.nl'  has a notification interval less than its check interval!  Notifications are only re-sent after checks are made, so the effective notification interval will be that of the check interval.
         Checked 66 services.
         Checked 56 hosts.
         Checked 5 host groups.
         Checked 0 service groups.
         Checked 1 contacts.
         Checked 1 contact groups.
         Checked 29 commands.
         Checked 6 time periods.
         Checked 0 host escalations.
         Checked 0 service escalations.
 Checking for circular paths…
         Checked 56 hosts
         Checked 0 service dependencies
         Checked 0 host dependencies
         Checked 6 timeperiods
 Checking global event handlers…
 Checking obsessive compulsive processor commands…
 Checking misc settings…
 Total Warnings: 2
 Total Errors:   0

Geen errors, dus config is ok. Nu nagios hergestart met: sudo systemctl restart nagios

Stap 4. Werking gecheckt

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *