- Tekst ontleden met Python
|
Voor de statistische regenmeter wordt een website uitgelezen en vervolgens met de tekst worden ontleed om de neerslaggegevens hier uit te kunnen halen. | |
- Beschrijving
|
Wij gebruiken sinds 2018 Python (home) in plaats van Perl, vooral omdat het iets leesbaarder kan zijn en nog makkelijker in het gebruik voor beginners. Verder wordt Python door vele systeem programma`s gebruikt waaronder bijvoorbeeld PgAdmin4. | |
- Modules
|
Modules voor Python zijn een soort bibliotheken.
Qt wordt gebruikt als de grafische interface. Voor de verbinding met Python zijn er 2 mogelijkheden en wij gebruiken PySide2. Grafische elementen worden widgets genoemd.
- Voorbereiding
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt autoremove
Enkel als het niet meer wil is dit nog te proberen. Download de gewenste *.whl en ga naar de directory waar deze ligt opgeslagen.
- Installatie
pip install PySide2
- Pyserial
Pyserial (home) is een manier om een seriële communicatie tussen een PC en een Arduino via de bestaande USB verbinding op te zetten. Je hebt de USB verbinding namelijk toch al. Na een clean install moeten de volgende modules worden geïnstalleerd om te kunnen ontwikkelen aan deze applicatie.
Onder Ubuntu moet u de seriële poort vrijgeven voor de gebruiker.
- Voorbereiding
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt autoremove
- Installatie
sudo apt install python3-pip
pip3 install pyserial
- Windows10 installatie
- Installatie
pip install --upgrade --user pyserial
- Tips en tricks
shortintro Pyserial
python3 -m serial.tools.list_ports => lijstje met alle beschikbare seriële poorten.
Wij kiezen voor Inputs voor het uitlezen van bijvoorbeeld een joystick (voorbeeld).
- Voorbereiding
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt autoremove
- Installatie
pip3 install inputs (Successfully installed inputs-0.5)
- psutil
Voor het uitlezen van bijvoorbeeld de accu stand van een laptop of andere gadgets (manual.pdf).
- Voorbereiding
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt autoremove
- Installatie
sudo pip3 install psutil
- Voorbereiding
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt autoremove
- Installatie
sudo pip3 install psutil
|
- Het maken van een Windows executable.
|
Py installer doet de truc onder windows. Wat doet de truc onder Ubuntu? Miets. Windows in powershell python C:\Users\richard\Desktop\py\testpyserial.py. Geeft aan dat pyserial niet is geinstalleerd.
|
- Installatie en updates
|
- Windows 10
- Installatie
Kijk met python -V of python --version in een Powershell of python reeds is geïnstalleerd. Let op want dit zal een ander resultaat geven dan: python -v (). Het moet wel een versie van 3.0 of hoger zijn want versies van 2 zullen niet werken.
Kijk bij /www.python.org/downloads/windows/. Vanuit daar de AMD86, x86 versie op mijn laptop geïnstalleerd door de *.exe te downloaden en te installeren. Hou wel even de geavanceerde instellingen in de gaten, zoals het toevoegen van paden en het geschikt maken voor alle gebruikers aanvinken.
Overigens hoeft er na de installatie niet python3 te worden gebruikt als commando in de Powershell. Sterker nog: dat zal niet werken: gebruik gewoon python. pip werkt ook gewoon zonder toevoeging 3.
- Updates
sudo apt-get update && sudo apt-get upgrade Dit is nog Linux.
- Ubuntu 18
- Installatie
Er wordt verondersteld dat de installatie van python is uitgevoerd. Zie ook python. Voor de geïnstalleerde release kijk met:
python3 -V . Let op want dit zal een ander resultaat geven dan: python -V
Installeer python en enkele noodzakelijke hulpprogramma`s:
sudo apt-get install python3-dev python3-pip python3-virtualenv
sudo apt install build-essential libssl-dev libffi-dev
We gaan eerst kijken of Python is geïnstalleerd en zo ja welke versie door in een terminal python3 --version uit te voeren (toelichting). Na een bare metal installatie van Ubuntu 18.04 krijg ik te zien dat ik Python 3.6.7 heb. Een Python programma kan geschreven worden met een gewone tekstverwerker. Schrijf het programma helloworld.py en enter nu in een terminal: python3 /var/www/py/helloworld.py. Dit is de eerste kennismaking met Python.
- Updates
sudo apt-get update && sudo apt-get upgrade
- Substations
Voor alle soorten substations geldt dat alle instellingen die nodig zijn om te kunnen functioneren worden in een eeprom opgeslagen. Daardoor blijven ze jarenlang bewaard, ook als de voeding wordt afgeschakeld. Ieder substation heeft een klok met Lithium accu. De klok blijft 1 jaar lopen zonder voeding. Lokale handbediening als override op ieder substation. 3-standen: Uit(0), Aan(I), Automatisch(II). Bangood
|
- Editor
|
In principe kan iedere teksteditor worden gebruikt om een Python programma mee te schrijven. Maar sommigen zijn makkelijker in het gebruik dan anderen.
- Thonny
Dit is simpel te installeren en werkt beperkt. Interessant voor beginners.
- Tekst editor
Is eigenlijk ook niks mis mee.
|
- Evdev versus Inputs
|
Wij kiezen Inputs (installatie) omdat het ook compatibel is met Windows. Inputs (github) en Evdev (home) zijn beiden modules voor Python waarmee hardware zoals een joystick kan worden uitgelezen maar evdev is niet platform onafhankelijk.
- Windows vs linux
Evdev loopt uitsluitend op Linux. Inputs loopt ook op Windows. Qt-Gamepad vraagt om Evdev en gebruiken we dus maar niet.
- Ze zijn verschillend?
First, the easy flowchart: do you have to create a new virtual device that has a set of specific capabilities? Use uinput. Do you have to read and handle events from an existing device? Use evdev. Do you have to create a device and read events from that device? You (probably) need two processes, one doing the uinput bit, one doing the evdev bit (bron).
- Inputs is simpeler
In het gebruik met Python is Inputs simpeler.
- evdev legacy
NIET GEBRUIKEN. Beter is inputs als module. Maar Qt Gamepad vraagt om evdev: jammer dan. Voor het uitlezen van een joystick. (installatie)
- Voorbereiding
sudo apt-get install python-dev python-pip gcc
- Installatie
sudo pip3 install psutil
|
Virtual environment |
Een virtual environment is eigenlijk de manier om als gebruiker programma`s uit te voeren. Je kunt een eigen hoekje kiezen waar jij alle rechten hebt. Hier kan Python dan een directory met een virtual environment maken. Installatie python geeft aan dat alles correct geïnstalleerd is:
sudo apt install -y python3-venv
python3 -m venv /path/to/new/virtual/environment
python3 -m venv /var/www/html/venvs/richard
De virtual environments worden gemaakt in de directory /usr/richard/venvs/
pip3 install --upgrade pip setuptools --user
cp /var/www/py/helloworld.py var/www/html/venv/richard/helloworld.pyMaak helloworld.py
Ga in terminal naar: cd /var/www/html/venv
source richard/bin/activate
Let op het scherm. Vanuit deze geactiveerde directory (cd richard):
python helloworld.py
deactivate en alles is weer normaal.
|
PostgreSQL interface |
Om met de PostgreSQL database te kunnen communiceren moet er een interfacing software worden geïnstalleerd. Er bestaan meerdere interfaces maar psycopg wordt van alle kanten aanbevolen. Python heeft een eigen pakketmanager (pip vs apt-get). Eerst een sudo apt install python3-pip en vervolgens sudo apt install virtualenv uitvoeren. Nu kan er een zogenaamde virtual environment worden opgezet met virtualenv --python=/usr/bin/python3 venvs/postgrestest. Deze virtual environment moet worden geactiveerd met: source ~/venvs/postgrestest/bin/activate. Na deze voorbereidingen volgt de eigenlijke installatie met pip install psycopg2-binary. Doe nu in een terminal: python /var/www/py/hellopostgresql.py. Dit laat een lijstje zien met de bruikbare databases. En na een reboot is alles weer verdwenen. Ook erg handig Grrrrr. pip3 install -U pip # make sure your pip is up-to-date, howto install. Werkt dus ook niet. Na redelijk veel gepruts werkt het.
pip3 install --upgrade pip --user 2018-12-26 upgraded naar pip-18.1
apt-cache search psycopg
sudo apt-get install python3-psycopg2
sudo apt-get install python-psycopg2-dbg
|
Data verzamelen |
Het programma flora002.py wordt gebruikt om de data te verzamelen. Het kan worden gestart in een terminal met: python3 /var/www/py/flora002.py. Dit programma hoort eeuwig te blijven lopen totdat het onderbroken wordt met Ctrl-C. |
//This is an include, so no parsing needed
$qry2 = ("SELECT onderdelen.*,
soortonderdeel.id
FROM onderdelen
JOIN soortonderdeel ON onderdelen.idsrtodd = soortonderdeel.id
WHERE onderdelen.partid = $idpart
;");
$result2 = pg_query($con1, $qry2);
$row4 = pg_fetch_array($result2); //Make the fields accesible
foreach( $row4 AS $key => $val ){
$$key = stripslashes( $val );
}
$jaar = substr($changeddate,0,4);
$maand = substr($changeddate,5,2);
$dag = substr($changeddate,8,2);
$lastupdate = ("$jaar $maand $dag");
$prtsrttxt = get_txt($con1, 26, 1, $idsrtodd);
$jaar = substr($createddate,0,4);
$maand = substr($createddate,5,2);
$dag = substr($createddate,8,2);
$create_stamp = ("$dag $maand $jaar");
//GENERAL INFO FOR EVERY USER **************************************************
echo (" ");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3923); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo (" (edit)");
}
echo ("Algemene informatie test | ");
if ($codetext) { //Code like KY-026 or NA-41
echo ("");
$tmp = get_txt($con1, 9, $koekje[2], 3739); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //Class for colour
}else{ //So you are not allowed to translate
echo $tmp; //Show screenname of this field in user language
} //End of If you want to translate this fieldname at screen
echo ("  | ");
if ($codelink) {
echo ("$codetext");
}else{
echo ("$codetext");
} //End of if ($pinoutlink)
echo (" | ");
} //End of if ($codetext)
$tmp = get_txt($con1, 9, $koekje[2], 3741); //Fieldname at screen
if ($prijseurinclbtw > 0){ //Show price indication
$prijs_formatted = number_format($prijseurinclbtw / 100, 2, ',', '.');
echo ("$tmp   | ");
echo ("");
if ($urlprijs){
echo ("€  $prijs_formatted");
}else{
echo ("€  $prijs_formatted");
} //End of if ($urlprijs > "")
echo (" | ");
} //End of if ($prijseurinclbtw > 0)
if ($sketchtext) { //Link to OWN SOFTWARE
$tmp = get_txt($con1, 9, $koekje[2], 3738); //Fieldname at screen
echo ("$tmp   | ");
if ($sketchlink) {
echo ("$sketchtext");
}else{
echo ("$sketchtext");
} //End of if ($sketchlink)
echo (" | ");
} //End of if ($sketchtext)
$tmp = get_txt($con1, 9, $koekje[2], 3744); //Fieldname at screen
if ($pinouttext) { //Pinout
echo ("$tmp   | ");
if ($pinoutlink) {
echo ("$pinouttext");
}else{
echo ("$pinouttext");
} //End of if ($pinoutlink)
echo (" | ");
}
$tmp = get_txt($con1, 9, 1, 3735); //Fieldname at screen
$tmp2 = get_txt($con1, 26, 1, $row4[16]); //Group name in its language
echo ("$tmp   | "); //MENU GROUP
echo ("");
echo ("$tmp2 | ");
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$tmp = get_txt($con1, 9, $koekje[2], 3918); //Fieldname at screen LANGUAGE
if ($row4[26] == 1) {$imgname = "nederland.png";}
if ($row4[26] == 2) {$imgname = "deutschland.png";}
if ($row4[26] == 3) {$imgname = "uk.png";}
if ($row4[26] == 4) {$imgname = "france.png";}
echo ("$tmp | ");
echo ("");
echo (" | ");
$tmp = get_txt($con1, 9, $row4[27], 3919); //Fieldname at screen
$statuskey = get_status_key($con1, $status);
$tmp2 = get_txt($con1, 61, $koekje[2], $statuskey); //Fieldname at screen
echo ("$tmp   | "); //STATUS
echo ("$status $tmp2 | ");
}
$tmp = get_txt($con1, 9, 1, 3966); //Fieldname at screen
echo ("$tmp   | "); //LAST CHANGED
$tmp = substr($changeddate, 0, 10);
echo ("$tmp | ");
echo (" ");
return;
////////////////////////////////////////////////////////////////////////////////
function get_status_key($con, $num){
$qry = ("SELECT id FROM status WHERE nr = $num ;");
$result = pg_query($con, $qry);
$row = pg_fetch_array($result);
return ("$row[0]");
}
// LIST ALL SOFTWARE THAT WILL RUN OM THIS PART *****************************
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry2=("SELECT tblsystext.txtname
, software.urlmain
, software.sftname
, software.sftid
, software.controller
FROM software
LEFT JOIN tblsystext ON software.controller = tblsystext.recordid
WHERE position(' $idpart ' in software.prtlst) > 0
AND software.rstid = 2
AND tblsystext.lanid = $koekje[2]
AND tblsystext.txlid = 19
ORDER BY sftname ASC
, controller ASC
;");
$result = pg_query($con1, $qry2);
if (pg_num_rows($result)>0) { //Only if at least 1 program exists
echo (' ');
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3922); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" |
---|
");
while($col = pg_fetch_array($result)){
$col[0] = ("$col[0]");
echo (" ");
echo ("$col[2]   | ");
echo ("$col[0] | ");
if ($koekje[0] > 0 and $koekje[3]>0){ //User is logged in and translates
echo ("");
echo ("(Edit) | ");
}
echo (' ');
}
echo (' ');
}
?>
// LIST ALL ROBOTS THAT INCLUDE THIS PART ***********************************
// $idpart
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry_bpp=("SELECT farmbotversie.id
, farmbotversie.part_list
, tblsystext.txtname
FROM farmbotversie
LEFT JOIN tblsystext ON farmbotversie.id = tblsystext.recordid
WHERE tblsystext.txlid = 27
AND tblsystext.lanid = $koekje[2]
ORDER BY tblsystext.txtname ASC
;");
$result_bpp = pg_query($con1, $qry_bpp);
$header = 0;
while($colbpp = pg_fetch_array($result_bpp)){ //Only if at least 1 robot exists
if(substr_count($colbpp[1], " $idpart ") > 0){
if ($header == 0) {
echo ("");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3879); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" | ");
$header++;
} //End of if ($header == 0)
echo ("");
echo ("$colbpp[2]");
//Show software van deze bot
$qry=("SELECT software_basedir
FROM farmbotversie
WHERE id = $colbpp[0];");
$result = pg_query($con1, $qry);
$col = pg_fetch_array ($result ,0);
$dir1 = "/var/www/html/robotigs/software/$col[0]";
$arr1 = glob($dir1, GLOB_ONLYDIR);
if (isset($arr1[0])){
$folder = $arr1[0];
$countertmp = 0;
echo ("");
foreach (scandir($folder, 1) as $filename) {
if ($filename<>"." AND $filename <>".."){
if ($countertmp == 0){
$countertmp++;
} //End of if ($countertmp == 0)
$tmp = "/";
$dir = substr($folder, 14) ."/";
$link = $tmp .$dir .$filename;
$showname = substr($filename, 0 ,-4);
echo ("- ");
echo "$showname";
echo ("
");
} //End of if ($filename<>"." AND $filename <>".."){
} //End of foreach (scandir($folder, 1) as $filename)
echo ("");
} //End of if (isset($arr1[0]))
echo (" | ");
}
}
if ($header > 0){
echo (" ");
}
?>
Warning: include(/var/www/html/robotigs/includes/wishlistperpart.php): Failed to open stream: No such file or directory in /var/www/html/robotigs/includes/parts_header.php on line 128
Warning: include(): Failed opening '/var/www/html/robotigs/includes/wishlistperpart.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/robotigs/includes/parts_header.php on line 128
| //Location:/robotigs/includes/ picts_show.php
// Requieres: $pict_list and several picture handling javascript routines
//*** FROM HERE ON THE PICTURE CORNER STARTS -----------------------------------
if ($pict_list){ //There are 1 or more pictures to be printed
echo ("");
$counter = 0;
$aantal = str_word_count($pict_list, 0, "0123456789");
$lijst = str_word_count($pict_list, 1, "0123456789");
while($counter < $aantal){
$pictkey = $lijst[$counter];
$qryy1 = ("SELECT *
FROM illustrations
WHERE ill_id = $pictkey
;");
$resulty1 = pg_query($con1, $qryy1);
while($row = pg_fetch_array($resulty1)){ //Fields accesible by their name
foreach( $row AS $key => $val ){
$$key = stripslashes( $val );
}
}
$image = ("/robotigs/documentatie/plaatjes/$ill_name");
$pictfull = str_replace('_small', '', $image); //Pictfull=biggest version
$alt = ("Just wait till your 57....");
$txtname = get_txt($con1, 18, $koekje[2], $ill_id); //Robot illustrations subtitles
echo ("");
echo (' ');
$nummer = $counter + 1;
$txtAfb = get_txt($con1, 9, $koekje[2], 3865); //Pic Afb
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo ("$txtAfb $nummer: ");
echo ("$txtname");
echo (" ");
echo ("Ontkoppelen ");
if ($counter==0){
echo ("Up ");
}else{
echo ("Up ");
}
if ($nummer == $aantal){
echo ("Down");
}else{
echo ("Down");
}
}else{ //Else of if Meaning the current useer is logged in
echo ("$txtAfb $nummer: $txtname");
}
echo (''); //End of this picture
$counter++; //Prepair for next picture
}
echo (' | '); //All pictures are printed
} //End of if there are 1 or more pictures to be printed ----------------------
?>