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 VIEWEnergy_status
AS SELECT CAST(a
.sample datetime
AS DATE) ASDatum
, COUNT(0) ASSlimme meter
, (SELECT COUNT(0) FROMlaadpaal
b
WHERE CAST(b
.sample datetime
AS DATE) = CAST(a
.sample datetime
AS DATE)) ASLaadpaal
, (SELECT COUNT(0) FROMwatermeter
c
WHERE CAST(c
.sample datetime
AS DATE) = CAST(a
.sample datetime
AS DATE)) ASWatermeter
, (SELECT COUNT(0) FROMpv
d
WHERE CAST(d
.sample datetime
AS DATE) = CAST(a
.sample datetime
AS DATE) ANDd
.inverter
= 1) ASInverter 1
, (SELECT COUNT(0) FROMpv
e
WHERE CAST(e
.sample datetime
AS DATE) = CAST(a
.sample datetime
AS DATE) ANDe
.inverter
= 2) ASInverter 2
FROMslimme_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 }
Sensor | check_command | Toelichting |
Slimme meter | check_mysql_query!2!280:300!Slimme Meter | 2: 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 |
Laadpaal | check_mysql_query!3!20:30!Laadpaal | 3: 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 1 | check_mysql_query!5!270:300!Inverter 1 | 5: 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 2 | check_mysql_query!6!180:210!Inverter 2 | 6: 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