Prometheus node exporter

Prometheus (https://prometheus.io/) tai atviro kodo monitoringo sistema. Veikimo principas labai paprastas, kompiuteryje/serveryje veikia taip vadinamas node exporter’is kuris tam tikru portu (pagal nutylėjimą 9100), tekstiniu formatu atiduoda metrikas.

Metrikos gali būti serverio apkrovos parametrai, aparatinės įrangos informacija (temperatūros, aušintuvai, diskai ir t.t.), ar kažkokios programinės įrangos mariadb/mysql, apache ir t.t. metrikos. Exporterių tikrai yra prirašyta pakankamai daug, o jei reikia kažko išskirtinio, tikrai labai nesunkiai galima eksportuoti savo kažkokias susigalvotas metrikas.

Mano tikslas – ofiso serverių (labiau switch‘ų) kambaryje stebėti patalpos temperatūrą. Viskas turėtų patekti į prometheus ir būti atvaizduota grafanoje (https://grafana.com/).

Taigi, konstruojam hardwarinį temperatūrų node exporterį. Tam panaudojau Arduino nano ir enc28j60 LAN modulį.

Kodo pavyzdžių ir kaip viską sujungti tikrai galima rasti internete. Bet visos papaišytos schemos man neveikė. Problema buvo LAN modulio maitinimas. Kai kurios schemos nurodo LAN moduliui paimti įtampą nuo arduino 3V3 pin’o. Nuo jo pajungus, man moduliukas išviso neveikė. Nedegė jo LED ir nedegė indikaciniai LED pajungtus LAN kabelį.

Kai kurios schemos nurodo jungti nuo 5V. Tad jungiu nuo 5V pin’o. Viskas lyg veikia, bet LAN modulio čipas pradeda labai kaisti – per aukšta įtampa. Datasheet’as sako, kad reikia maitinti nuo 3V3, bet man nuo jo neveikia. Naršau internetą ieškodamas problemos ir randu: I was amazed to find that the ENC28J60 draws 200mA ! No wonder it wont work from the Nano’a 3.3v output (which is rated at 25 mA). (https://forum.arduino.cc/index.php?topic=452822.0)

Problema aiški! Lituoju 3V3 įtampos stabilizatorių ant 5V arduino pin’o, viskas veikia!… kokias dvi valandas. Viską pasijungiu ant stalo ir vėl bandau iš naujo. Po ~5min pradedu jausti, kad ardudino plokštelė pradeda palengva šilti. Panašu, kad perkaista.. bet kodėl?

Kaip matosi nuotraukoje, naudoju maža maitinimo šaltinį 220V -> 5V. Juo užmaitinu arduiną. Arduino nano turi 5V stabilizatorių, prie kurio aš jungiau LAN modulį, pasirodo, kad jis irgi yra per silpnas (nelabai čia protingai buvo jungti du stabilizatorius nuosekliai). Taigi dabar jungiu stabilizatorių jau ant Vin pin’o, ant kurio ateina 5V iš maitinimo modulio. Pagaliau schema stabiliai veikia.

Nuotraukoje matosi kaip viskas sumontuota viduje. Vidus nelabai gražus gavosi, mažoka dėžutė. Tvarkingai pritvirtinti gavosi tik maitinimo šaltinį. LAN modulis ir arduino turi tik super mažas skylutes montavimui, tad prie korpuso nesugalvojau kaip pritvirtinti, o klijuoti nenorėjau. Dėlto ir LAN jungties nesigavo gražiai išvesti per dėžutės šoną.

Rezultate curl’inant gauname:

$ curl http://192.168.10.250:9100/metrics
# Arduino DS1820 temperature exporter
temperature{thermometer="28ff6a0160170573"} 18.00
temperature{thermometer="28ff252160170585"} 16.00
temperature{thermometer="28ffed5530170399"} 16.69

Žemiau vaizdas iš Prometheus konsolės, Prometheus grafikas ir Grafanos grafikas:



Pastarasis kambarys nėra labai lankomas, todėl paskutinis žingsnis buvo sukurti prometheus alert’ą. Tad esant vėdinimo sistemos gedimui, ar dėl kažkokių priežasčių sustojus vėdinimo sistemai, praėjus 5min kai bus viršyta 22C temperatūra, Prometheus alert manager’yje pasirodys pranešimas apie pakilusia patalpos temperatūrą.

Duomenų rašymas į nutolusį influxdb naudojant Redis

Pradinė schema.
Raspberry pi surenka termometrų duomenis ir PHP bei CURL’o pagalba (rašiau čia) keliauja į dvi influxdb bazes. Viena yra lokaliai pačioje avietėje, kita yra nutolusiam VPS serveryje.

Problema pažymėta raudona rodykle. Kartais dingsta namuose interneto ryšys (vis dar 5GHz antena, 100mbs planas, laukiu kada suvirins šviesolaidį). To pasekoje išsiskiria duomenys tarp abiejų influxdb.

Senesnės influxdb versijos turėjo clustering funkcionalumą, bet šitas malonumas dabar mokamas.

Taip pat yra tokie sprendimai kaip influx-relay, bet This retry logic is NOT sufficient for for long periods of downtime as all data is buffered in RAM.

Problemos sprendimo schema:

Duomenys rašomi lygiagrečiai į lokalų influxdb ir redis.

Į redis’ą patogiai rašyti galima su phpredis. Archlinux’e pkgbuild’as yra AUR’e, nutolusiam VPS’e yra Centos 7 tad ten teko susikompiliuoti iš source. Abiem atvejais reikia paredaguoti php.ini ir pridėti extension=redis.so.

Tad palyginimui kodas tarp CURL’inimo į influxdb ir redis:

//Post to influxDB
$ch = curl_init("http://127.0.0.1:8086/write?db=termometrai");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"temperaturos ".$daviklioHWID."=".$tempvalue);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
//Post to redis
date_default_timezone_set("UTC"); 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('VPS1',"temperaturos ".$daviklioHWID."=".$tempvalue." ".strval(time()));
$redis->close;

Į redis rašau POST duomenis, tam kad kitam gale aklai galėčiau juos vėl pakišti CURL’ui. Vienas skirtumas, kad pridedu šio momento timestamp’ą. Jis reikalingas tam, kad duomenys iš redis’o iki nutolusio serverio, ryšio dingimo metu, gali keliauti ir kelias valandas. Atsiradus ryšiui ir surašius duomenis be timestamp’o į influxdb duomenys sukristu ne su laiku kada jie buvo įrašyti į redis, o su laiku kada buvo įrašyti į influxdb. Tad šiuo atveju duomenis atkeliauja jau atsinešdami ir laiką kada buvo nuskaityti.

Nutolusiam VPS serveryje duomenis iš redis’o skaito PHP skirptas. Redis duomenis skaitau su:

$redis->lPop('VPS1');

Ši funkcija paima vieną įrašą iš nurodytos “eilės” (kuri šiuo atveju yra VPS1) ir iškarto ta įrašą ištrina. Sekančiu kartu paimama kita reikšmė ir pašalinama. Tokiu būdų gaunamas duomenų FIFO.

Rezultate turime labai greitai ir labai mažai resursu naudojančia redis. Avietė pildo duomenis naudodama RPUSH, nutolęs serveris duomenis tuo pačiu metu skaito ir trina su LPOP.

Dingus ryšiui, (nutolęs serveris nemato Rasbery Pi) consumer’is kas 10 sekundžių kartoja prisijungimo procedūrą tol kol prisijungia. Po viena ima visus duomenis tol kol ištuštėja eilė. Kai eilė ištuštėja “užmiega” dešimčiai sekundžių po kurių vėl pasitikrina ar yra duomenų. Jei nėra, toliau “miega” 10 sekundžių, jei yra “sukramto” tai kas yra.

Consumer’io (php skripto) veikimą užtikrina Supervisord. Tai labai nedidelis servisas kuris gali užtikrinti bet kokio skriptuko ar programos nenutrūkstama veikimą. Jei skriptas dėl kažkokios priežasties nulūžtu arba jį tiesiog nu kill’inus, supervisord pasirūpina jo paleidimu.

Rezultatas

Per dvi valandas dirbtinio ryšio nebuvimo, duomenys sukrito per ~15 sekundžių.

Metrikoms: influxDB + Grafana

Vienintelės mano renkamos metrikos yra temperatūra apie kuria rašiau Protingas namas. 1 Dalis. Temperatūra.. Tiesa nuo tada termometrų padaugėjo ir dabar jų aštuoni. Ir duomenys jau senokai saugomi ne mariadb/mysql, o influxDB. O duomenims peržiūrėti ir analizuoti naudoju Grafana.

Oficealaus influxdb paketo nėra, tad teks susikompiluoti iš AUR:

yaourt -S influxdb

Pirmuosius influxdb žinksnius galima rasti čia. Tikrai nėra nieko sudėtingo.

Mano duomenų bazė vadinasi termometrai, o lentelė temperaturos.

Duomenys atrodo taip (stulpelių yra daugiau, apkirpau, kad tilptu į puslapį):

> select * from temperaturos limit 20 
name: temperaturos
time                28-0000052D4E36 28-0000052DC554 28-0000052DCA4A
----                --------------- --------------- ---------------
1491421622470175617                                 20.6875
1491421622933431847 5.6875
1491421624775957066                 20.1875
1491421683164960608                                 20.6875
1491421683725053335 5.6875
1491421685386914026                 20.1875
1491421743393921182                                 20.6875
1491421743956469988 5.6875
1491421745634864667                 20.1875
1491421802759609752                                 20.6875
1491421803239163911 5.6875
1491421804969827574                 20.1875

Duomenys taip pabire, nes kiekvienas termometras įrašomas atskirai (skiriasi įrašymo laikas). Viso to išvengti galima surinkus visus duomenis ir įrašinėjant viską vienu metu, viena užklausa. Taip užklausa, nes duomenis įrašinėjami kreipiantis tam tikru portu CURL‘u, WGET‘u ar kita programine įranga darant GET užklausą. Galima tiesiog į naršyklės URL’ą suvesti atitinkama adresą.

Aš duomenis rašau su PHP paCURL‘inant URL‘ą. Kodas žemiau:

        //Post to influxDB
        $ch = curl_init("http://localhost:8086/write?db=termometrai");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,"temperaturos ".$daviklioHWID."=".$tempvalue);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        curl_close($ch);

daviklioHWID yra termometro DS1820 adresas.
time (laiko) reikšmės paduoti nereikia.

Tame viskas ir paprasta, tiesiog aklai padavinėju termometro adresą ir jo reikšmę. Jei sistemoje atsiranda naujas termometras (naujas adresas) nieko daryt papildomai nereikia, stulpelis influxDB atsiranda automatiškai.

Dabar apie duomenų atvaizdavimą. Duomenis grafiškai atvaizduoti naudoju grafana.

sudo pacman -Sy grafana

Kai pradėjau naudoti Grafana tada dar ji nemokėjo skaityti iš mariadb/mysql. Dabar paskutinėse versijose ji tai gali daryti. Bet influxdb veikia akivaizdžiai greičiau, ypač kai db serveris paleistas ant Raspberry Pi model B.

Pirmą kartą prisijungus prie Grafana reikia prisidėti Data source t.y. duomenų šaltinį. Šiuo atveju tai indluxdb.

Turint duomenų šaltinį galima bandyti susikonfiguruoti Dash board t.y. langas kuriame bus grafikas/grafikai.

Maniškis atrodo taip (paspaudus pasididina):

Vienos metrikos (vienos linijos grafike) užklausa atrodo taip:

Visos keturios užklausos:

Atkreipiam dėmesį į GROUP BY. Grupuoju dėl dviejų priežasčių. Pirmoji, tai kaip minėjau aukščiau, duomenis įrašomi ne tuo pačiu momentu (skiriasi keliomis sekundėmis). Panaudojus grupavimą tiesiog skaičiuojamas, šiuo atveju trijų minučių vidurkis (tam ir naudojamas mean()) nesvarbu kiek matavimu per tas tris minutes buvo padaryta. Taip visi grafikai laiko atžvilgiu tampa lygus.

Antroji priežastis, kad termometrai nėra super tikslūs ir esant tomis pačiomis sąlygomis jie atiduota kažkiek kintamus (po kablelio) duomenis. Tad šiuo atveju grafikas kiek sulyginamas ir panaikinami 0.xxx nuokrypiai.

Protingas namas. 2 Dalis. Apšvietimo valdymas.

Iškarto sakau, nebuvo minties valdyti kambarių apšvietimo, tame prasmės aš nematau. Pažaisčiau pats, parodyčiau draugams tuom viskas ir pasibaigtu.

Tikslas buvo kiemo apšvietimo valdymas. Namo perimetre yra 10W “senukiniai” LED žibintai, parkavimosi vieta apšviesta 20W LED žibintu. Ir statybininkai visiems nameliams sustatė ~50cm aukščio žibintus su 5W LED lemputėmis. Taip pat statytojas pasirūpino, kad 5W žibintas automatiškai užsidegtu nusileidus saulei (ant stogo yra šviesos imtuvas). Visi kiti šviestuvai jau mano paties montuoti.

Visų žibintų maitinimas paimtas nuo minėto šviesos daviklio, o tai reiškia, kad ir labai norit, šviesiu paros metu žibintai nedega.

Viskas pajungta nuo Raspberry gpio pin’ų (jungčių). Naudotas rėlių blokas iš Kinijos. Buvo minčių bloką lituotis pačiam, bet perkant detales pvz Lemonoj, vien jos kainuoja daugiau nei gatavas produktas.

Programinė įranga ir kaip viską valdau. GPIO išvadus labai paprasta valdyti su WiringPi. Aš naudoju Archlinux, tad šį paketą instaliuoju:

sudo pacman -Sy wiringpi

Pasinaudodami gpio komanda pasižiūrime ką turime išvaduose:

[dinux@alarmpi ~]$ gpio readall
 +-----+-----+---------+------+---+-Model B1-+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   0 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   1 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |  OUT | 0 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | IN   | GPIO. 1 | 1   | 18  |
 |  21 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | OUT  | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |  OUT | 1 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |  OUT | 1 | 21 || 22 | 0 | OUT  | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |  OUT | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+-Model B1-+---+------+---------+-----+-----+

Rėlių valdymui panaudojau pin’us pagal BCM 10, 9, 11, pagal wPi 12, 13, 14
Pagal nutylėjimą šie pin’ai (jei neklystu) buvo IN todėl jų rėžimą keičiu

gpio mode 12 out
gpio mode 13 out
gpio mode 14 out

Po šių komandų mano minėti pin’ai jau dirba kaip išėjimas (taip kaip parodyta aukščiau esančioje lentelėje)

Norint įjungti/išjungti rėlę pajungta prie wPi 12 kontakto, naudojame:

gpio write 12 1
# arba
gpio write 12 0

Jungimo schema taip pat labai paprasta. +5V ir GND paimiau nuo laisvų GPIO išvadu, valdymo signalas jau ankščiau minėti pin’ai. Įtampai ir signalams perduoti naudojau UTP kabelį (atstumas ~1 metras) prie jo galų litavau Dupont cable jumeper

Vis dėlto, vienoje vietoje buvau strigęs. Atrodo viskas sujungta gerai, signalas ateina (indikacinis LED užsidega), bet rėlė nesuveikia. Pasirodo problema buvo vienas blogas kabeliukas ir būtent GND. Pakeitus jį jau netik indikacinis LED užsižiebdavo, bet ir rėlė suveikdavo.

imgp3647-pef_6cbkryimgp3649-pef_r1lbryimgp3655-pef_8q5dryimgp3656-pef_gjnoryimgp3658-pef_3587qyimgp3659-pef_2g3qry

Na ir žemiau video. Tiesa prastokos kokybės, bet esmė yra parodoma.

Pagaliau Raspberry veikia stabiliai

Kaip jau rašiau, buvo bėdų su maitinimu, kurias galvojau, kad išsprendžiau, bet pasirodo — ne. Problema pasirodo išliko, tik ne tokia dažnai pasireiškianti. Avietė kartą per savaite/dvi pamesdavo HDD, užtekdavo perkrauti ir vėl viskas dirbdavo tvarkingai iki kito karto. Taip kentėjau beveik pusmetį, kol neperskaičiau, kad Western Digital išleido specialų diską avietei, kuris vadinasi PiDrive. Nuorodą į produktą: http://wdlabs.wd.com/products/wd-pidrive-314gb/.

Šis diskas specifinis tuo, kad jis savyje neturi nei SATA nei IDE jungties. Ant jo valdymo plokštės yra USB3.0 jungtis. Lygiai tokie pat diskai montuojami į WD Passport išorinius, nešiojamus diskus. Skirtumas tas, kad šis diskas truputi modifikuotas. Jo startui reikalinga mažesnė srovė (diskas įsisuka lėčiau), tai pat sulėtintas jo valdiklio taktinis dažnis (naudojama mažiau energijos) na ir žinoma keista talpa už kiek didesnę kainą.

Diskas iš Nyderlandu (Olandija) iki durų Kaune atkeliavo DHL pagalba per maždaug savaitę, bėda tik tame, kad pačio išsiuntimo teko laukti tris savaites (gavau atsiprašymo laišką dėl vietinės WD logistikos apkrovimo).

Atkeliavus diskui, kopijuoju viską į naują. Kompiuteris startuoja, viskas veikia, viskas puiku.

Praėjus, berods keletai dienų, pasigirsta iš disko keisti garsai. Įrašas čia: https://www.youtube.com/watch?v=IGtzaIlMgWA Keičiau ir kabelius ir maitinimo blokus, jungiau per usb switch’ą su išoriniu maitinimu.. niekas nepadėjo. Taip avietė praleido gerą mėnesį išjungta, nelabai buvo laiko aiškintis kas čia daros ir internetas šiuo klausimu nieko nepadėjo.

Pradėjus vėl domėtis šiuo klausimu WD supporto forume atsirado tema, pasirodo ne pas mane viena tokie garsai sklinda. Pradėjus gilintis į bėda, kolega IRC (o taip aš jį vis dar naudoju) pasiūlė pasidomėti hdparm rakto S ir B parametrais.

Finalinis rezultatas:

sudo hdparm -B 255 /dev/sda1

Ši komanda išjungia disko Advanced Power Managment, diskas dabar sukasi tyliai, jokie pypsėjimai ar kiti pašaliniai garsai nesklinda.

Vėl paišosi temperatūros grafikas:
Ekranvaizdis_2016-07-26_23-01-26

Žiūrint į grafika matosi, kad oro temperatūra lauke buvo pakilus iki 40,4C. Kad ir kokia karšta diena buvo, bet tai nėra realu. Pats daviklis yra ant stogo šešėlyje, įdėtas į baltą dėžutę nuo foto juostelės, bet panašu tas negelbėja. Sekantis žingsnis konstruoti taip vadinama Stevenson Screen.

Protingas namas. 1 Dalis. Temperatūra.

Protingas, išmanus, bet turbūt automatizuotas namas labiausiai tinka nusakyti šiai sistemai.

Mano galvoje sukasi labiau informatyvaus namo terminas nei aukščiau paminėti, nes kažkokio labai didelio valdymo galvoje neturiu. Todėl pirmos mintys/tikslai yra tai, kad namas (šiuo atveju butas) informuotu apie save, savo būklę šeimininką.

Aprašymuose gali trukti vienos ar kitos smulkesnės ar nelabai smulkios detalės, palieku erdvės patiems pagalvoti, pasinaudoti paieškos sistemomis 😉

Taigi, pats pirmas dalykas ko mums reikės, tai sistemos serverio/kompiuterio. Jo funkcijas atlieka Raspberry Pi model B
43W5302 lado

Operacinė sistema (pati distribucija) gal nelabai tinka tokio tipo kompiuteriui, tam turbūt reiktu rinktis debian ar kažką panašaus, bet aš pasirinkau Archlinux. Vienintelė ir pagrindinė to priežastis, šią distribuciją naudoju visuose savo (ir žmonos) kompiuteriuose, gerai žinau jos sudėti ir valdymą.

[dinux@alarmpi ~]$ uname -a
Linux alarmpi 3.12.35-1-ARCH #1 PREEMPT Tue Dec 23 07:14:51 MST 2014 armv6l GNU/Linux

Kompiuteris maitinamas nuo po ranka papuolusio mobilaus telefono pakrovėjo (atrodo Huawei), pradinėje stadijoje buvo naudojama vėlgi po ranka papuolusios 2Gb microSD kortelės įdėtos į SD perėjimą. Vėliau dariau visokius bandymus tad prireikė vietos ir kortelė buvo pakeista į 4Gb.

Pirmasis link išmanumo žingsnis buvo termometrų pajungimas. Kaip pasijungti termometrą/termometrus labai puikiai aprašyta čia http://www.sbprojects.com/projects/raspberrypi/temperature.php, pasinaudojus google, galima rasti daug įvairių pavyzdžių.

Kaip ir šioje nuorodoje parodyta naudoju DS18B20+ termometrus kurie įdėti į dėžutes nuo foto juostelės. Dėjau tam, kad termometras nebūtų plikas ir nereaguotu į trumpalaikius temperatūros svyravimus.

Duomenis pradiniam variante saugojau RRD bazėje. Tai lyg duomenų bazė kartu su atvaizdavimo varikliu. Archlinux’e instaliuojam:

sudo pacman -Sy rrdtool

Pateikiu bazės kūrimo komandinę eilutę:

 rrdtool create temp.rrd --start N --step 60 \
  DS:laukas:GAUGE:900:-50:50 \
  DS:svetaine:GAUGE:900:-50:50 \
  DS:kambarys:GAUGE:900:-50:50 \
  RRA:AVERAGE:0.5:1:12 \
  RRA:AVERAGE:0.5:1:288 \
  RRA:AVERAGE:0.5:12:168 \
  RRA:AVERAGE:0.5:12:720 \
  RRA:AVERAGE:0.5:288:365

Šia komanda sukuriam bazę, kurioje bus trys termometrai, jie pavadinti laukas – lauko temperatūrai, svetaine – svetainės kambario temperatūrai ir kambarys – darbo kambario temperatūrai saugoti.

Kas minutę pasileidžia cron job’as kuris nuskaito termometrų reikšmes ir jas įrašo į minėta bazę:

rrdtool update /root/rrd/temp.rrd N:$LAUKAS:$SVETAINE:$KAMBARYS

Kas penkias minutes cron job’as paleidžia skriptą kuris sugeneruoja grafikus:

   rrdtool graph /srv/http/temp_h.png --start -1h \
             DEF:laukas=/root/rrd/temp.rrd:laukas:AVERAGE \
             DEF:svetaine=/root/rrd/temp.rrd:svetaine:AVERAGE \
             DEF:kambarys=/root/rrd/temp.rrd:kambarys:AVERAGE \
             LINE1:laukas#0000FF:"Lauko temperatūra [C]" \
             LINE1:svetaine#FF0000:"Svetainės temperatūra [C]" \
             LINE1:kambarys#00FF00:"Dainiaus kambario temperatūra [C]"

   rrdtool graph /srv/http/temp_d.png --start -1d \
             DEF:laukas=/root/rrd/temp.rrd:laukas:AVERAGE \
             DEF:svetaine=/root/rrd/temp.rrd:svetaine:AVERAGE \
             DEF:kambarys=/root/rrd/temp.rrd:kambarys:AVERAGE \
             LINE1:laukas#0000FF:"Lauko temperatūra [C]" \
             LINE1:svetaine#FF0000:"Svetainės temperatūra [C]" \
             LINE1:kambarys#00FF00:"Dainiaus kambario temperatūra [C]"

   rrdtool graph /srv/http/temp_w.png --start -1w \
             DEF:laukas=/root/rrd/temp.rrd:laukas:AVERAGE \
             DEF:svetaine=/root/rrd/temp.rrd:svetaine:AVERAGE \
             DEF:kambarys=/root/rrd/temp.rrd:kambarys:AVERAGE \
             LINE1:laukas#0000FF:"Lauko temperatūra [C]" \
             LINE1:svetaine#FF0000:"Svetainės temperatūra [C]" \
             LINE1:kambarys#00FF00:"Dainiaus kambario temperatūra [C]"

   rrdtool graph /srv/http/temp_m.png --start -1m \
             DEF:laukas=/root/rrd/temp.rrd:laukas:AVERAGE \
             DEF:svetaine=/root/rrd/temp.rrd:svetaine:AVERAGE \
             DEF:kambarys=/root/rrd/temp.rrd:kambarys:AVERAGE \
             LINE1:laukas#0000FF:"Lauko temperatūra [C]" \
             LINE1:svetaine#FF0000:"Svetainės temperatūra [C]" \
             LINE1:kambarys#00FF00:"Dainiaus kambario temperatūra [C]"

   rrdtool graph /srv/http/temp_y.png --start -1y \
             DEF:laukas=/root/rrd/temp.rrd:laukas:AVERAGE \
             DEF:svetaine=/root/rrd/temp.rrd:svetaine:AVERAGE \
             DEF:kambarys=/root/rrd/temp.rrd:kambarys:AVERAGE \
             LINE1:laukas#0000FF:"Lauko temperatūra [C]" \
             LINE1:svetaine#FF0000:"Svetainės temperatūra [C]" \
             LINE1:kambarys#00FF00:"Dainiaus kambario temperatūra [C]"

Reiktu atkreipti dėmesį, kad pagal mano pateikta pavyzdį paveiksliukai saugomi /srv/http/ kataloge.

Rezultate turime grafikus. Pateikiu tik kelis t.y. dienos bei mėnesio:
temp_d

temp_m

Vėliau atsiradus poreikiui patogiai select’int duomenis nusprendžiau juos saugoti pradžioje sqlite bazėje, bet pastebėjau, kad duomenų rašymo metu bazės byla yra užrakinama. Po nesėkmingų bandymų išvengti rakinimo (išvengti visgi pavyko, bet įrašo metu traukiant duomenis operacija užtrukdavo, nes pirma palaukdavo kol pilnai įrašomi duomenys) perėjau prie Mysql, o tiksliau mariaDB.

Komanda su kuria rašau duomenis:

    mysql -u manonamai -pmanoslaptazodis  manonamai  -e "INSERT INTO tbl_sensors_data (sd_sensor_id, sd_data) values (\"1\",$KAMBARYS);"
    mysql -u manonamai -pmanoslaptazodis  manonamai  -e "INSERT INTO tbl_sensors_data (sd_sensor_id, sd_data) values (\"2\",$SVETAINE);"
    mysql -u manonamai -pmanoslaptazodis  manonamai  -e "INSERT INTO tbl_sensors_data (sd_sensor_id, sd_data) values (\"3\",$LAUKAS);"

Pritaikius savo reikmėms amCharts (http://www.amcharts.com) turime gražesnę ir dinamiškesnę (užsikrovus pusulapiui rodyklės sujuda) vizualizaciją:
Ekranvaizdis_2015-03-17_23-11-30

Reiktu paminėti, kad lauko temperatūra rodoma apie du laipsnius aukštesnė nei yra realybėje, nes daviklis į lauką patenka per liaudyje vadinama fortkę (orlaidę) ir yra pakankamai arti namo sienos.

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close