Projectje : temperatuurmeting & archivering

Er werd mij gevraagd om een temperatuurlogging te doen van een bepaalde ruimte. De temperatuur mocht er een bepaalde waarde niet overschrijden. Indien dat wel het geval zou zijn, moest er een alarm afgaan. In verband met tracebility moesten de gegevens bewaard worden. En het zou ook nog mooi zijn als dit ook in een grafiek gepresenteerd werd.

Ik zal hier beschrijven hoe ik dit oploste (als proefproject wordt de temperatuur van mijn bureau gemeten). Het is misschien niet de mooiste oplossing, zeer waarschijnlijk zijn er betere. In ieder geval zijn er proffesionele oplossingen met tags of buttons die het temperatuursverloop registreren.
Maar dit project is misschien een goed startpunt voor als je iets gelijkaardigs zou willen doen.

 

Lieven.



 
Inhoud

1. Meting
2. Archivering
  2.1 seriële communicatie
  2.2 archivering
3. Grafieken
  3.1 Grafieken genereren
  3.2 Aanbieden
4. De temperatuur'server'
  4.1 De gegevens aanbieden
  4.2 De gegevens ophalen
  4.3 De gegevens ophalen - betere versie
  4.4 De gegevens klaarmaken voor MRTG
 



 
1. Meting

Het probleem van de meting met een alarmkontakt was snel op te lossen met een red lion controls PAX temperatuurmeter. Deze heeft meerdere set-points en bijhorende uitgangen. Op die manier kan er ter plaaste al een pre-alarm (temperatuur bijna te hoog) en een alarm (temperatuur te hoog) geactiveerd worden.
Een andere installeerbare optie is een seriële interface (RS232 of RS484). Die komt van pas voor de ...
 

2. Archivering

Dank zij de seriële interface kunnen de gegevens van de meter uitgelezen worden. Setpoints kunnen, indien gewenst, gewijzigd worden. Minimum en maximum kunnen gereset worden.
Om de gegevens te archiveren nam ik een afgedankte 486/33 met 8MB ram en 260MB HD.
Daarop kwam debian 2.1 (2.2 met de nieuwere kernel heeft helaas meer ram nodig).
Een lichte installatie (+/- 75 MB hardeschijfruimte in gebruik) waarbij in het volgende nog werd voorzien :

  • sjinn
  • boa
  • temperatuur'server'
Dat zullen we eens nader bekijken :
  2.1 seriële communicatie

Mijn broer's principe

Alles bestaat al (maar je moet het vinden)

indachtig, levert wat zoekwerk het programma sjinn op, dat voor de seriële communicatie kan zorgen. De meter reageert op het kommando P* met een antwoord dat via de setup vooraf geconfigureerd werd. In mijn geval : actuele temperatuur, cumulatie, huidig minimum en huidig maximum.
Op het kommando

sjinn -d /dev/ttyS0 -b9600 -s "P*" -r56 -n -w1
krijgen we als antwoord bv
26.3

8152.5

27.6

22.3

Het zou mooi zijn als we deze gegevens regelmatig meten (bv om de minuut) en per dag in een bestand zouden steken ...
  2.2 archivering

Mijn broer's principe indachtig, levert wat zoekwerk ook een passend script op.
Na een kleine aanpassing maakt dit script per dag een bestand aan met daarin door komma's gescheiden velden met datum & uur en de temperaturen. Zoals onderstaand voorbeeld :

2001.06.02 16:21.05, 26.3, 27.3, 22.9
Voilà. Ik ben er.
Nu enkel de optie 'grafische weergave' nog ...
  3. Grafieken

Vermits de komputer zelf niets ander te doen heeft, kunnen we hem gerust zelf nog de grafieken laten genereren en presenteren.
 

3.1 Grafieken genereren

Mijn broer's principe indachtig, levert wat zoekwerk een programma op :
csv2png converteert een CSV (comma separated variable) bestand naar een PNG grafiek.

Nu enkel nog de grafiek beschikbaar maken voor 'iedereen'.
En we kunnen tevens enkele van de vorige dagen er bij aanplakken.
 

3.2 Aanbieden

Het door velen verguisde dselect weet me te zeggen dat boa een lichte http server is. Even installeren, nog een HTML-letje brouwen (voornamelijk voor een automatische refresh van de pagina) en klaar is kees.
Het adres van de komputer in mijn browser intikken levert me volgend resultaat.
Met de eerder vermelde grafiek van enkele dagen erbij.

Spartaans, maar in principe voldoende.

Mooiere grafieken zouden eigenlijk wel welkom zijn. MRTG kan dat, maar maakt wel gemiddelden van de aangevoerde gegevens. Dit is echter geen bezwaar, omdat we voor de 'exacte' waarden toch al bovenstaande grafiek en de bestanden hebben.

Dan moet ik wel MRTG nog bij op deze komputer installeren. Of ...

Op een andere komputer draait MRTG al om de trafiek van onze routers & servers in het oog te houden. Het zou toch mooi zijn, indien ik daar de temperatuurgegevens ook kan visualiseren.
Allee, vooruit :
 

4. De temperatuur'server'

Hoe krijg ik op een betrouwbare manier de temperatuurgegevens op de 'MRTG komputer' ?
 

  • de directory met gegevens op de temperatuurkomputer mounten op de MRTG komputer ? 
  • met ftp de gegevens ophalen (van temperatuurkomputer) ? 
  • met ftp de gegeven opsturen (naar de MRTG komputer) ? 
  • ...


Uiteindelijk valt me een ander idee in: de gegevens met telnet ophalen : connecteer naar een bepaalde poort op de temperatuurkomputer, en die geeft je dan de gegevens direct door.
 

4.1 De gegevens aanbieden

De temperatuurgegevens worden regelmatig aangevuld in het 'datum-van-vandaag-bestand'. Daar zouden we ze kunnen uithalen. We kunnen ook, elke keer dat het temperatuurbestand aangevuld wordt, een tweede bestand, bv /usr/local/templog/temperatuur, schrijven met daarin enkel de laatste gegevens. Dan kan dit eventueel apart van het logbestand geformatteerd worden.

Vervolgens passen we /etc/services aan : voeg volgende regel toe :

temperatuur     2000/tcp
En ook in /etc/inetd.conf voegen we een regel toe (opgelet : dit is één regel maar in je brouwservenster is hij mogelijk in stukken gebroken) :
temperatuur     stream  tcp     nowait  root    /usr/sbin/tcpd  cat /usr/local/templog/temperatuur
Voilà, een connect op poort 2000 (de 'temperatuur' service) start een programma dat enkel de inhoud van het opgegeven bestand laat zien.

even testen :

# telnet 192.168.100.5 2000
Trying 192.168.100.5...
Connected to 192.168.100.5.
Escape character is '^]'.
Temperatuur op 2001.05.31 18:25.33, 26.3, 27.2, 22.5
Connection closed by foreign host.
#
4.2 De gegevens ophalen

Nu moeten we op de MRTG komputer enkel iets in de zin van

/usr/bin/telnet 192.168.1.25 2000 2>/dev/null
doen, de gegevens uitfilteren en we hebben wat we willen. Dacht ik. Maar helaas. Hoewel dit wel werkt wanneer het manueel uitgevoerd wordt, is dat niet zo wanneer dit script door MRTG (via een cron jobke) wordt aangeroepen. Dan krijgen we enkel
Trying 192.168.100.5...
Connected to 192.168.100.5.
Escape character is '^]'.
En op stderr
Connection closed by foreign host.
Waar is de lijn met de temperatuurgegevens naartoe ???
101 dingen proberen leveren niets op. Het gaat niet. &$ù#@$!

Voor al uw problemen: slechts één adres : de nieuwsgroepen. Dezelfde dag van mijn vraag in de nieuwsgroep had ik al een antwoord: telnet is een lastige klant om door scripts te laten gebruiken, en zeker wanneer ze via cron lopen. Kan telnet er echt niet toe gebracht worden om de gegevens in een bestand op te slaan ? De door Mark Jonckheere aangebrachte tip i.v.m. telnet leverde helaas geen oplossing op. De TERM variabele zetten en ook COLUMNS en LINES zetten halen niets uit.

Enfin, dan maar over een andere boeg gooien. Er is immers nog mijn broer's principe ...

Helaas, deze keer geen pasklaar programma gevonden. Misschien niet goed genoeg gezocht ? of niet lang genoeg gewacht op verdere nieuwsgroepantwoorden ? of ... niet aandachtig genoeg gelezen zoals verder zal blijken ...
Maar ondertussen rijpt een ander idee: ik had nog ergens op een disketje een script dat in perl een connectie naar een pop-server maakt. Ik heb in mijn jonge dagen :-) nog wat geprogrammeerd. Anderzijds staat hier al een hele tijd 'Perl 5 interactive course' op de plank te blinken. Die 3 bij elkaar ...

Na veel geknutsel, geblader en gelees kwam ik dan tot een perl script dat het gewenste doet.

Even proberen :

#./lees
Temperatuur op 2001.05.31 18:25.33, 26.3, 27.2, 22.5
#
Dat is al OK.
Na test via cron (met redirect van de uitvoer naar een bestand) blijkt alles ook naar wens te functioneren.
  4.3 De gegevens ophalen - betere versie

Mijn broer's principe blijft echter gelden. In de nieuwsgroepen verschijnt ook nog een berichtje van Geert Uytterhoeven waarin de eenvoudige oplossing wordt voorgesteld : netcat
Na een stevige por en grondige herlezing van de nieuwsgroepdraad blijkt dat Mark Jonckheere dat in zijn eerste antwoord als eerste al als oplossing had aangedragen !!! Maar om een of andere duistere reden heb ik daar dus domweg overgekeken. Eigen schuld, dikke bult. Door goed te lezen had ik meer dan een uur geknoei met perl kunnen vermijden.

Na installatie ervan blijkt het inderdaad dé oplossing te zijn. 
 

#nc 192.168.100.5 2000
Temperatuur op 2001.06.03 16:25.33, 24.5, 27.2, 22.5
#


NB : de volledige nieuwsgroepdraad kan je vinden bij Google, de status op 4-06-2001 staat hier lokaal.
 

4.4 De gegevens klaarmaken voor MRTG

In het geval van het perl script van 4.2, moeten we nog een klein beetje prutsen en de output is

#./lees
 26.3
0
0
TempLog
#
Klaar voor MRTG. 

In het geval van optie 4.3 (dat de voorkeur geniet) is het ook eenvoudig :
 

#nc 192.168.100.5 2000 | awk -F, '{print $2; print 0; print 0; print "TempLog"}'
 24.5
0
0
TempLog
#


Nu nog het configuratiebetand voor MRTG nog maken en ik ben er.

Zie hier het resultaat.