Analoginių parametrų atvaizdavimas internetinėje svetainėje

Analoginiai duomenys randasi duomenų bazėje. Užduotis vaizdžiai atvaizduoti dinaminį parametrų pokytį interneto naršyklėje. Šią užduotį sudaro dvi dalys: duomenų nuskaitymas ir atvaizdavimas. Žemiau aprašysiu abu procesus.

A. Duomenų nuskaitymas iš duomenų bazės.

Šis etapas apima duomenų periodinį užklausos formavimą, rezultato gavimą, rezultato išvedimą. Interneto svetainėje aktyvuojame JavaScript procedūrą vgrrefresh().

HTML kalba tai atrodys:

body onload="vgrrefresh();"

Procedūrą sudaro viena eilutė:

function vgrrefresh() { 
	setInterval(function() {vgrrefresh1();},1000); 
}

Ši funkcija iškviečia periodinį kreipimąsi į sekančia funkciją vgrrefresh1(). Ji patalpnta faile vejas.js, kurio turinys pateiktas žemiau:

var ct=0;
var ve=0;
var ctmax=50;
var ctx;
var myChart;
var DuplRec=0;//užklausa grąžina tokį pat įrašą, kaip ir praeita užklausa
var vgrss;//start stop kintamasis
var vgrid=0;//užklausiamų duomenų id kintamasis
var ooo="";//outut isvedimo kintamasis
var vgrgo=false;//užklausai startuoti
var vgrctreset=false;//ctreset - naujausi duomenys
var tik=5;//tik - priodas
function vgrrefresh() {
    ctx = document.getElementById('myChart1').getContext('2d');
    myChart = new Chart(ctx, {
        type: 'line',
        data: {
            labels: [],
            datasets: [{
                label: 'Vėjo greitis',
                data: [],
                backgroundColor: "rgba(153,255,51,0.4)"
              }, {
                label: 'Generatoriaus dažnis',
                data: [],
                backgroundColor: "rgba(127,153,0,0.4)"
              }, {
                label: 'Srovė',
                data: [],
                backgroundColor: "rgba(255,153,0,0.4)"
              }, {
                label: 'Įtampa',
                data: [],
                backgroundColor: "rgba(73,153,0,0.4)"
              }, {
                label: 'Apkrova',
                data: [],
                backgroundColor: "rgba(73,153,127,0.4)"
              }]
        },
        options: {
            animation: false,
            animation: {duration: 0}
        }    
    });
    realtime=false;
    vgrstartstop();
}
function vgrrefresh1() {//Send a http request with AJAX http://api.jquery.com/jQuery.ajax/
    Toggle_color();
    if (vgrctreset==true) {vgrid=0; vgrctreset=false;}
    if (realtime==true) {vgrid=0;}
    var uzklausa="host=vejas001&id=" + vgrid;
    $.ajax({
        type: "POST",
        cache: true,
        url: 'http://uzsakymai.defas.lt/vgreitis.php',             //the script to call to get data          
        data: "host=vejas001&id=" + vgrid,           //you can insert url argumnets here to pass to api.php for example "id=5&parent=6"
        dataType: 'json',                //data format      
        success: function(data) {        //on recieve of reply
            if (data!=null) {
                var out="";
                for (i=0;i<11;i++) {out=out+" " + data[i];}//alert(JSON.stringify(data));
                vgrid=parseInt(data[0])+tik; //užklausos parametras
                    if (data[7]==0) {ve=0;} else {ve=(1000000/12/(data[7])).toFixed(2);}//data[7] - meandro periodas mikrosekundėmis. 1m/s - 12 impulsų!
                    if (data[8]==0) {ge=0;} else {ge=(1000000/12/(data[8])).toFixed(2);}//data[7] - generatoriaus signalo periodas mikrosekundėmis. rpm
                    ooo="ct=" + ct + " data=" + out;
                    ooo+="<br>Vėjo greitis:" + ve+ " m/s<br>";
                    ooo+="Apkrova=" + ((data[9] & 255)/256*100).toFixed(2) + "%<br>";
                    ooo+="Apkrovos indeksas=" + (data[9]>>>8) + "<br>";
                    document.getElementById('output22').innerHTML=ooo;
                    document.getElementById('DL').value=data[11].substring(0,10);
                    // recommend reading http://api.jquery.com/category/selectors/
                    if (ct==ctmax) {shiftarray();} else {ct++;} 
                    myChart.data.labels[ct]=data[11].substring(11,16);
                    myChart.data.datasets[0].data[ct]=ve;
                    myChart.data.datasets[1].data[ct]=ge;
                    myChart.data.datasets[2].data[ct]=data[1];
                    myChart.data.datasets[3].data[ct]=data[4];
                    myChart.data.datasets[4].data[ct]=((data[9] & 255)/256*100).toFixed(2);
                    myChart.update();
            }
            vgrgo=true;
        },
        error: function(xhr, status, error) {
            document.getElementById('output22').innerHTML+=". Kaida:" + error;
            vgrgo=true;
        }
    });
    vgrgo=true;
}
function shiftarray() {
    for (i=0;i<ctmax;i++) {
        myChart.data.labels[i]=myChart.data.labels[i+1];
        myChart.data.datasets[0].data[i]=myChart.data.datasets[0].data[i+1];
        myChart.data.datasets[1].data[i]=myChart.data.datasets[1].data[i+1];
        myChart.data.datasets[2].data[i]=myChart.data.datasets[2].data[i+1];
        myChart.data.datasets[3].data[i]=myChart.data.datasets[3].data[i+1];
        myChart.data.datasets[4].data[i]=myChart.data.datasets[4].data[i+1];
        //myChart.data.datasets[5].data[i]=myChart.data.datasets[5].data[i+1];
    }
    //myChart.options: {animation: false,animation: {duration: 0}};    
}
function vgrstartstop() {
    if (document.getElementById('vgrstartstop').value=="Stop") {
        document.getElementById('vgrstartstop').value="Start";
        clearTimeout(vgrss);
    } else {
        document.getElementById('vgrstartstop').value="Stop";
        vgrgo=true;       
        vgrss=setInterval(function() {vgrgocheck();},1000);
    }   
}
function vgrgocheck() {
    if (vgrgo==true) {
        vgrrefresh1();
        vgrgo=false;
    }  
}
function Resetct() {
    vgrctreset=true;
}
function Toggle_color() {
    if (document.getElementById('vgrstartstop').style.border=="2px solid red") {
        document.getElementById('vgrstartstop').style.border="2px solid green";    
      } else {
        document.getElementById('vgrstartstop').style.border="2px solid red";    
    }
}
function Toggle_realtime() {
    if (realtime==false) {
        document.getElementById('realtime').value="Įrašas"; 
        realtime=true;           
      } else {
        document.getElementById('realtime').value="Realiu laiku";  
        realtime=false;      
    }
}
function setid() {
    vgrid=parseInt(document.getElementById('setid').value);
}
function settik() {
    tik=parseInt(document.getElementById('settik').value);
}

Šioje funkcijoje formuojama AJAX užklausa į vgreitis.php failą su parametru host=vejas001, identifikuojančiu jėgainę. Sistema kuriama keletos jėgainių valdymui. Taigi JavaScript procedūra formuoja http užklausą:

http://uzsakymai.defas.lt/vgreitis.php?host=vejas001

Failo vgreitis.php turinys:

<?
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: X-PINGOTHER");
header("Access-Control-Max-Age: 3600");
if(($dbh=mysqli_connect("localhost", "vejas", "dvejasD1", "VJserver", 3306)) > 0 ){
  if(isset($_REQUEST['host'])) {
    $q="Select * from VJserver.hostai where host='".$_REQUEST['host']."' order by id desc limit 1";
    if (!$res = mysqli_query($dbh, $q)) {
		echo $q."<br>".mysqli_error($dbh);
	  } else {
        $row = mysqli_fetch_array($res);
        if(($dbh=mysqli_connect($row["IP"], "vejojegaines", "vejojegaines", "vejojegaines", 3306)) > 0 ){
            if ($_REQUEST['id']!=0) {
                $id=$_REQUEST['id'];
              } else {
                $q="Select id from vejojegaines.spi order by id desc limit 1";//TSL
                if (!$res = mysqli_query($dbh, $q)) {
                    echo $q."<br>".mysqli_error($dbh);
                  } else {
                    $row = mysqli_fetch_assoc($res);
                    $id=$row['id'];
                }
            }
            $q="Select * from vejojegaines.spi where id=".$id." order by id asc limit 1";//TSL
            if (!$res = mysqli_query($dbh, $q)) {
                echo $q."<br>".mysqli_error($dbh);
              } else {
                while($row = mysqli_fetch_row($res)) {echo json_encode($row);}
            }
        } else echo "Klaida 2-ame connecte: ".mysqli_error($dbh); 
    }
  } else echo "Naudoti: <a href=\"http://uzsakymai.defas.lt/vgreitis.php?host=vejas001&id=0\">Nuoroda</a>";
} else echo mysqli_error($dbh);
?>

Kaip tipinį atsakymą gauname pagal DB užklausos ‘Select * from vejojegaines.spi order by id desc limit 1’ formatą. Atkreipkite dėmesį, kad užklausa formuojama į valdiklio DB, kuris randamas pagal įrašą centriniame serveryje: „Select * from VJserver.hostai where host='”.$_REQUEST[‘host’].”‘ order by id desc limit 1″. Čia $_REQUEST[‘host’] yra tas pats parametras iš http užklausos. Tai galima remiantis strategine nuostata, pagal kurią kiekviena jėgainė kas 15 min registruojasi centriniame serveryje pranešdama savo IP adresą. To galima būtų išvengti naudojant statinius IP adresus. Taigi atsakymo formatas:

["909795","13","11","8","10","11","9","27700","224480","12291","237762269","2018-11-16 05:50:10"]

Čia duomenų formatas atitinka duomenų bazės lentelės struktūrą, kur 12 parametrų atskirtų kableliu reiškia: identifikatorių (DB įrašo eilės numeris), A0-A5 – analoginės Arduino matavimo reikšmės, vėjo ir generatoriaus greičius mikrosekundėmis, apkrovos indeksą (aukštsnis baitas) ir koeficientą (žemesnis baitas) patalpintus viename žodyje, TimeStamp reikšmė – gautas iš Arduino laiko parametras ir data su laiku, DB įrašo (Rpi) data ir laikas. DB lentelės struktūra:

DROP TABLE IF EXISTS `vejojegaines`.`spi`;
CREATE TABLE  `vejojegaines`.`spi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `A1` smallint(5) unsigned NOT NULL,
  `A2` smallint(5) unsigned NOT NULL,
  `A3` smallint(5) unsigned NOT NULL,
  `A4` smallint(5) unsigned NOT NULL,
  `A5` smallint(5) unsigned NOT NULL,
  `A6` smallint(5) unsigned NOT NULL,
  `VGRusvid` int(10) unsigned NOT NULL,
  `GDAusvid` int(10) unsigned NOT NULL,
  `Apkrova` int(10) unsigned NOT NULL,
  `TS` int(10) unsigned NOT NULL,
  `Data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

B. Duomenų atvaizdavimas interneto naršyklės lange.

Vėjo greitis: nuo matavimo iki reikšmės parodymo

Vėjo greičio reikšmė paprastai ir pakankamai tiksliai pamatuojama, tačiau duomenų išvedimas yra sudėtingas. Šiame straipsnyje aprašysiu visą procesą nuo daviklio iki reikšmės parodymo ekrane.
Vėjo greičiui matuoti skirtas prietaisas vadinamas anemometru. Naudosime Three Cup Anemometer Aluminium Alloyed DC12-24V su skaitmeniniu duomenų perdavimu per RS485 portą. Taip pat išduodamas meandro formos impulsinis signalas, kurio dažnis tiesiogiai priklausomas nuo vėjo greičio. Chakteristikose nurodoma: 1m/sek. greitį atitinka 12 impulsų.

Skaityti toliau: Vėjo greitis: nuo matavimo iki reikšmės parodymo

Pertekliniai duomenys

Duomenų srautas generuojamas RPI iš ARDUINO į MySQL DB yra labai didelis. Tai sulelia sunkumų perduodant juos iš VJC (vėjo jėgainės kontrolerį) į duomenų atvaizdavimo aplikaciją. Kaip pavyzdys gali būti komanda į DB ‘truncate spi’ – duomenų išvalymas, kuri trunka >30min. Čia būtų įdomūs konkretūs skaičiai: kiek per parą padaroma įrašų ir kiek laiko trunka šių įrašų trynimas. Šiandien komanda truncate spi paleista 5:00.

Iškelkim užduotį sumažinti duomenų srautą. Momentines reikšmes įrašinėkime cikliškai į spi lentelę, o į naują lentelę įrašykime apibendrintus duomenis. Paimkime 5 sekundžių intervalą, kas sudarys 5*20=100 kartų mažesnį srautą. Čia 20 kartų per sekundę yra momentinių duomenų įrašymo greitis.

Užduoties įgyvendinimui reikia:

1. Sukurti naują lentelę

Pavadinkime ją delta. Pagrindiniai lentelės duomenys bus šešios analoginės keitiklio reikšmės, duomenų įrašymo periodas ir absoliutus laikas. Taigi lentelės laukai: id (long integer), A0-A5 (byte), Periodas (integer – milisekundės), Date (timestamp).

2. Pakoreguoti RPI programą, kuri įrašinėja duomenis.

Prisiminkime, kuri vykdoma programos versija:

pi@raspberrypi:~ $ ps -xa |grep test
1263 ? S 0:00 sudo /home/pi/test3.o
1273 ? R 2712:37 /home/pi/test3.o /*paryškintas programos veikimo laikas*/

Žemiau yra C kodo iškarpa, formuojanti DB įrašą. Ją reiks koreguoti:

A0=resu[3] + resu[4]*256;
A1=resu[5] + resu[6]*256;
A2=resu[7] + resu[8]*256;
A3=resu[9] + resu[10]*256;
A4=resu[11] + resu[12]*256;
A5=resu[13] + resu[14]*256;
VGRA=resu[15] + resu[16]*256;
VGRB=resu[17] + resu[18]*256;
TS1=resu[19] + resu[20]*256;
TS2=resu[21] + resu[22]*256;
//TSa2Point=&TSa2[0];
//TS=AtmestiKrastinesReikmes(TSa2Point, jmax);
//int A0min=0xFFFF;int A0max=0;for (j=0; j<jmax; j++) {if (A0a[j]>A0max) A0max=A0a[j];if (A0a[j]<A0min) A0min=A0a[j];}
//int A1min=0xFFFF;int A1max=0;for (j=0; j<jmax; j++) {if (A1a[j]>A1max) A1max=A1a[j];if (A1a[j]<A1min) A1min=A1a[j];}
//int A2min=0xFFFF;int A2max=0;for (j=0; j<jmax; j++) {if (A2a[j]>A2max) A2max=A2a[j];if (A2a[j]<A2min) A2min=A2a[j];}
//int A3min=0xFFFF;int A3max=0;for (j=0; j<jmax; j++) {if (A3a[j]>A3max) A3max=A3a[j];if (A3a[j]<A3min) A3min=A3a[j];}
//int A4min=0xFFFF;int A4max=0;for (j=0; j<jmax; j++) {if (A4a[j]>A4max) A4max=A4a[j];if (A4a[j]<A4min) A4min=A4a[j];}
//int A5min=0xFFFF;int A5max=0;for (j=0; j<jmax; j++) {if (A5a[j]>A5max) A5max=A5a[j];if (A5a[j]<A5min) A5min=A5a[j];}
sprintf(qu, "insert into vejojegaines.spi values (\"\",%i,%i,%i,%i,%i,%i,%i,%i,null)",A0,A1,A2,A3,A4,A5, VGRA+VGRB, TS1+TS2*256*256);
//printf("qu=%s\n", qu);
res=mysql_perform_query(conn, qu);
mysql_free_result(res); 

Verta paanalizuoti gaunamus momentinius duomenis, parodytus žemiau. Paryškinti duomenys pasikartoja. Kodėl?:

Nr.id A1 A2 A3 A4 A5 A6 TSL TSH Date

1 193466 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
2 193465 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
3 193464 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
4 193463 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
5 193462 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
6 193461 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
7 193460 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
8 193459 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
9 193458 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
10 193457 783 780 782 815 784 786 49272 325578935 2017-11-14 06:44:04
11 193456 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:04
12 193455 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:04
13 193454 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:04
14 193453 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:04
15 193452 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:04
16 193451 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:03
17 193450 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:03
18 193449 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:03
19 193448 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:03
20 193447 796 806 801 828 811 810 48293 325578632 2017-11-14 06:44:03
21 193446 799 801 795 835 806 810 48293 325578632 2017-11-14 06:44:03

22 193445 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
23 193444 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
24 193443 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
25 193442 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
26 193441 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
27 193440 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
28 193439 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
29 193438 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
30 193437 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
31 193436 799 801 795 835 806 810 48568 325578334 2017-11-14 06:44:03
32 193435 794 809 798 831 807 814 18896 325578133 2017-11-14 06:44:03
33 193434 794 809 798 831 807 814 18896 325578133 2017-11-14 06:44:03
34 193433 794 809 798 831 807 814 18896 325578133 2017-11-14 06:44:03
35 193432 794 809 798 831 807 814 18896 325578133 2017-11-14 06:44:03
36 193431 794 809 798 831 807 814 18896 325578133 2017-11-14 06:44:03
37 193430 794 809 798 831 807 814 18896 325578133 2017-11-14 06:44:03
38 193429 796 807 798 831 807 814 18896 325578133 2017-11-14 06:44:03
39 193428 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
40 193427 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
41 193426 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
42 193425 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
43 193424 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
44 193423 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
45 193422 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
46 193421 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
47 193420 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
48 193419 796 807 796 839 806 813 48035 325577837 2017-11-14 06:44:03
49 193418 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:03
50 193417 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
51 193416 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
52 193415 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
53 193414 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
54 193413 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
55 193412 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
56 193411 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
57 193410 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
58 193409 799 806 796 828 811 807 46002 325577546 2017-11-14 06:44:02
59 193408 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
60 193407 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
61 193406 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
62 193405 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
63 193404 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
64 193403 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
65 193402 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
66 193401 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
67 193400 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
68 193399 795 803 797 829 807 806 45878 325577265 2017-11-14 06:44:02
69 193398 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
70 193397 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
71 193396 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
72 193395 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
73 193394 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
74 193393 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
75 193392 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
76 193391 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
77 193390 792 804 796 824 811 809 42022 325576982 2017-11-14 06:44:02
78 193389 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:02
79 193388 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:02
80 193387 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:02
81 193386 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:02
82 193385 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:02
83 193384 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:02
84 193383 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:01
85 193382 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:01
86 193381 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:01
87 193380 796 803 799 828 812 811 45781 325576699 2017-11-14 06:44:01
88 193379 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
89 193378 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
90 193377 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
91 193376 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
92 193375 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
93 193374 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
94 193373 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
95 193372 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
96 193371 796 801 799 833 802 812 43725 325576424 2017-11-14 06:44:01
97 193370 801 801 803 832 804 813 43397 325576158 2017-11-14 06:44:01
98 193369 801 801 803 832 804 813 43397 325576158 2017-11-14 06:44:01
99 193368 801 801 803 832 804 813 43397 325576158 2017-11-14 06:44:01
100 193367 801 801 803 832 804 813 43397 325576158 2017-11-14 06:44:01

Priežiūra

Jeigu SD kortelė užsipildė, df-h komanda rodo, kad naudojama 100% kaupiklio vietos atlaisvinti dalį vietos galima išvalant atsiųstus .deb paketus (cache) su komanda:

sudo apt-get clean

Po to bandome paleisti mysql serverį:

root@raspberrypi:/etc/init.d# ./mysql start
[ ok ] Starting mysql (via systemctl): mysql.service.

Prisijungiame su root vartotoju ir ištriname pagrindinę duomenų kaupimo lentelę:

root@raspberrypi:/etc/init.d# mysql -u root -p
mysql> use vejojegaines;
mysql> truncate spi;
Query OK, 0 rows affected (5 min 41.32 sec)

Saugumo klausimai

Pačiu netinkamiausiu laiku negalėjau prisijungti prie rpi. Keista. Labai didelė tikimybė, kad kažkas pakeitė pi vartotojo slaptažodį. Jo niekada nekeisdavau ir jis buvo pagal nutylėjimą. Taigi dabar pakeičiu pi vartotojo slaptažodį į ‘vejojegaines’.

SPI protokolas

SPI sąsaja siunčiama ir gaunama informacija turi atitikti tam tikrą protokolą, kuris realizuotas rpi – Arduino programose. Informacijos užklausėjas (Master) visada yra rpi. Komandos struktūra sudaryta iš Pradžios baito (PB), komandos baito (KB), paketo ilgio (DI),  duomenų sekos (INFORMACIJA) ir kontrolinės sumos (KS) bei liekamojo baito(KB).

PB – CB – DI – INFORMACIJA – KS – KB

PB yra visada vienodas ir yra 0x81 (HEX formatas).

CB aprašo komandos tipą. Šiuo metu naudojam dvi komandas: 0xA8 – analoginių reikšmių nuskaitymas ir 0xA9 – apkrovos kreivės reikšmių siuntimas.

DI sudaro INFORMACIJA baitų sekos skaičių.

KS yra kontrolinė suma apimanti baitus nuo SB iki KS imtinai. Ji turi būti lygi 0xFF.

KB yra ‘kvailas’ baitas (angl. dummy), kuris leidžia priimti gaunamo paketo kontrolinę sumą. Tai yra todėl, kad siunčiamas paketas lydimas gaunamo paketo. T.y siuntimo metu yra gaunama informacija. Kadangi gaunamas paketas yra tokio pat ilgio, tai priimamo paketo kontrolinės sumos baitas gaunamas tuo metu, kai siunčiamo paketo KS baitas jau išėjo, o siuntėjas dar turi išsiųsti kontrolinės sumos baitą

 

 

MySQL’e komanda saugoma HEX formate

 

 

 

Dabar sudarytos dvi komandos

darbas su MySQL ir lentelių struktūra

Mysql lentelių struktūra:

-- MySQL Administrator dump 1.4
-- Server version    5.5.44-0+deb8u1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Create schema vejojegaines
CREATE DATABASE IF NOT EXISTS vejojegaines;
USE vejojegaines;
-- Definition of table `duomenys`
DROP TABLE IF EXISTS `duomenys`;
CREATE TABLE `duomenys` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`laikas` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`itampa` double(7,2) NOT NULL,
`srove` double(7,2) NOT NULL,
`temperatura` double(7,2) NOT NULL,
`vejas` double(7,2) NOT NULL,
`vejokorekcija` double(7,2) NOT NULL,
`vid` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `Index_2` (`vid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci;

-- Definition of table `grupes`
DROP TABLE IF EXISTS `grupes`;
CREATE TABLE `grupes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Pavadinimas` varchar(128) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FK_grupes_1` FOREIGN KEY (`id`) REFERENCES `jegaine` (`gid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci;

DROP TABLE IF EXISTS `komandos`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `komandos` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `komanda` varchar(256) NOT NULL,
  `Atlikta` int(10) unsigned NOT NULL DEFAULT '0',
  `ModData` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

-- Definition of table `jegaine`
DROP TABLE IF EXISTS `jegaine`;
CREATE TABLE `jegaine` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Pavadinimas` varchar(128) CHARACTER SET latin1 NOT NULL,
`vid` int(10) unsigned NOT NULL COMMENT 'Vartotojo identifikatorius',
`gid` int(10) unsigned NOT NULL COMMENT 'Grupes identifikatorius',
PRIMARY KEY (`id`),
KEY `Index_2` (`vid`),
KEY `Index_3` (`gid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci;

-- Definition of table `spi`
DROP TABLE IF EXISTS `spi`;
CREATE TABLE `spi` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`A1` smallint(5) unsigned NOT NULL,
`A2` smallint(5) unsigned NOT NULL,
`A3` smallint(5) unsigned NOT NULL,
`A4` smallint(5) unsigned NOT NULL,
`A5` smallint(5) unsigned NOT NULL,
`A6` smallint(5) unsigned NOT NULL,
`TSL` int(10) unsigned NOT NULL,
`TSH` int(10) unsigned NOT NULL,
`Date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

Gautas klaidos pranešimas:

got error -1 from storage engine

Išrtyniau /var/lib/mysql/ibdata1 ir ib_logfile0 bei iblogfile1

Perstartavau /etc/init.d/mysql – ok

Aišku visas lenteles teko atstatyti iš backup’o (atstatymo duomenų tekstas aukščiau). MysqlAdmin Backup’o failas yra čia: vj.zip.