enabling
SSH
https://randomnerdtutorials.com/installing-raspbian-lite-enabling-and-connecting-with-ssh/
add
file “ssh” into boot folder
Establishing
an SSH Communication
$
sudo ssh pi@192.168.178.25
user:
pi, pass: pi
Shutting
Down
$
sudo poweroff
https://randomnerdtutorials.com/raspberry-pi-apache-mysql-php-lamp-server/
https://www.instructables.com/Installing-LAMP-Linux-Apache-MySQL-PHP-on-a-Raspbe/
Updating
and Upgrading
$
sudo apt update && sudo apt upgrade -y
Install
Apache2
$
sudo apt install apache2 -y
Testing
Apache installation
$
cd /var/www/html
$
ls -al
This
should show “index.html”
get
RasPi IP address
$
hostname -I
enter
IP address into Browser → the Apache Debian page should appear
Install
PHP
$
cd /var/www/html
$
sudo apt install php -y
$
sudo rm index.html
$
sudo nano index.php
Add
following script into the php file:
<?php
echo "hello world"; ?>
Save
with Ctrl+X >> y >> Enter, or
Ctrl+O >> Enter >> Ctrl+X
OR
<?php
phpinfo(); ?>
OR
$
echo "<?php phpinfo ();?>" >
/var/www/html/index.php
Restart
Apache
$
sudo service apache2 restart
test
if Apache2 is serving .php files by opening RasPi IP address in
browser
if
all is fine, index.php can be removed
$
sudo rm index.php
Install
MySQL (MariaDB Server)
$
sudo apt install mariadb-server php-mysql -y
$
sudo service apache2 restart
$
sudo mysql_secure_installation
In
all cases, answer with y
create
new user “admin”
with password “your_password”
$
sudo mysql --user=root --password
>
create user admin@localhost identified by 'your_password';
>
grant all privileges on *.* to admin@localhost;
>
FLUSH PRIVILEGES;
>
exit;
Important
to generate user that is not limited to a certain domain!!
>
grant
all privileges on *.* to 'admin3'@'%';
Install
phpMyAdmin
$
cd /var/www/html
$
sudo apt install phpmyadmin -y
Options:
dbconfig-common
Apache2
Configuring
phpmyadmin? OK
Configure
database for phpmyadmin with dbconfig-common? Yes
Password:
pi
$
sudo phpenmod mysqli
$
sudo service apache2 restart
open
following address
http://192.168.178.25/phpmyadmin
if
“Not Found”
$
cd /var/www/html
$
sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
$
ls
>>
phpmyadmin
again,
open following address
http://192.168.178.25/phpmyadmin
login
with username=root, password=pi
change
the permissions for your /var/www/html/ folder.
$
cd ~
$
ls -lh /var/www/
$
sudo chown -R pi:www-data /var/www/html/
$
sudo chmod -R 770 /var/www/html/
$
ls -lh /var/www/
https://randomnerdtutorials.com/esp32-esp8266-raspberry-pi-lamp-server/
Create
database:
esp_data
utf8mb4_general_ci
Create
table by calling SQL query:
CREATE
TABLE SensorData (
id
INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sensor
VARCHAR(30) NOT NULL,
location
VARCHAR(30) NOT NULL,
value1
VARCHAR(10),
value2
VARCHAR(10),
value3
VARCHAR(10),
reading_time
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PHP
script that is responsible for receiving incoming requests from the
ESP32 or ESP8266 and inserting the data into a MySQL database.
$
cd ~
$
nano
/var/www/html/post-esp-data.php
https://github.com/ChuckBell/MySQL_Connector_Arduino/wiki/Troubleshooting
tr
to connect to msql from another computer:
$
mysql
-uadmin
-ppi
–h192.168.178.25 –port=3306
$
mysql
--user=admin
--password=pi
--host=192.168.178.25
--port=3306
$
mysql
--user=admin
--password=pi
--host=
127.0.0.1
--port=3306
$
mysql
-u admin
-p pi
-h 127.0.0.1 test_arduino
Important
in case of “ERROR 2003 (HY000): Can't connect to local MySQL server
through socket”
$
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Here,
the binding address = 127.0.0.1 must be commented out!!!
Configuring
WiFi in headless modehttps://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
https://www.seeedstudio.com/blog/2021/01/25/three-methods-to-configure-raspberry-pi-wifi/
sshTo
enable SSH on a headless Raspberry Pi, simply place a file named
“ssh”, without any extension, onto the boot partition of the SD
card from another computer. This will tell Raspberry Pi to enable SSH
when booting. The content of the file does not matter.
wpa_supplicant.conf
$ sudo
nano /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant
GROUP=netdev
update_config=1
country=<Country
Code>
network={
ssid="<SSID>"
psk="<PASSWORD>"
scan_ssid=1
}
Arduino
script for writing to MariaDB/MySQL databaseCheck
sketch “Complex_Insert_WiFi_BE”
Showing
DB content as html pagehttps://randomnerdtutorials.com/esp32-esp8266-raspberry-pi-lamp-server/
$ nano
/var/www/html/esp-data.php
open
page http://192.168.178.25/esp-data.php
esp-data.php<!DOCTYPE
html>
<html><body>
<?php
/*
Rui
Santos
Complete
project details at
https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/
Permission
is hereby granted, free of charge, to any person obtaining a copy
of
this software and associated documentation files.
The
above copyright notice and this permission notice shall be included
in all
copies
or substantial portions of the Software.
*/
$servername
= "192.168.178.25";
//
REPLACE with your Database name
$dbname
= "test_arduino";
//
REPLACE with Database user
$username
= "admin3";
//
REPLACE with Database user password
$password
= "pi";
//
Create connection
$conn =
new mysqli($servername, $username, $password, $dbname);
//
Check connection
if
($conn->connect_error) {
die("Connection
failed: " . $conn->connect_error);
}
$sql =
"SELECT num,
message,
sensor_num,
value,
recorded
FROM hello_sensor
ORDER BY num
DESC";
echo
'<table cellspacing="5" cellpadding="5">
<tr>
<td>num</td>
<td>message</td>
<td>sensor_num</td>
<td>value</td>
<td>recorded</td>
</tr>';
if
($result = $conn->query($sql)) {
while
($row = $result->fetch_assoc()) {
$row_num
= $row["num"];
$row_message
= $row["message"];
$row_sensor_num
= $row["sensor_num"];
$row_value
= $row["value"];
$row_recorded
= $row["recorded"];
//
Uncomment to set timezone to - 1 hour (you can change 1 to any
number)
//$row_reading_time
= date("Y-m-d H:i:s", strtotime("$row_reading_time - 1
hours"));
//
Uncomment to set timezone to + 4 hours (you can change 4 to any
number)
//$row_reading_time
= date("Y-m-d H:i:s", strtotime("$row_reading_time + 4
hours"));
echo
'<tr>
<td>'
. $row_num
. '</td>
<td>'
. $row_message
. '</td>
<td>'
. $row_sensor_num
. '</td>
<td>'
. $row_value
. '</td>
<td>'
. $row_recorded
. '</td>
</tr>';
}
$result->free();
}
$conn->close();
?>
</table>
</body>
</html>
Plotting
of data from MariaDB/MySQL
databasehttps://randomnerdtutorials.com/visualize-esp32-esp8266-sensor-readings-from-anywhere/
$ sudo
nano /var/www/html/esp-chart.php
esp-chart.php
<!--
Rui
Santos
Complete
project details at https://RandomNerdTutorials.com
Permission
is hereby granted, free of charge, to any person obtaining a copy
of
this software and associated documentation files.
The
above copyright notice and this permission notice shall be included
in all
copies
or substantial portions of the Software.
-->
<?php
$servername
= "192.168.178.25";
//
REPLACE with your Database name
$dbname
= "test_arduino";
//
REPLACE with Database user
$username
= "admin3";
//
REPLACE with Database user password
$password
= "pi";
//
Create connection
$conn =
new mysqli($servername, $username, $password, $dbname);
//
Check connection
if
($conn->connect_error) {
die("Connection
failed: " . $conn->connect_error);
}
$sql =
"SELECT num,
message,
sensor_num,
value,
value_h,
recorded
FROM hello_sensor
WHERE
sensor_num = 0
ORDER BY num
DESC limit 40";
$result
= $conn->query($sql);
while
($data = $result->fetch_assoc()){
$sensor_data[]
= $data;
}
$recorded
= array_column($sensor_data, 'recorded');
//
******* Uncomment to convert readings time array to your timezone
********
/*$i =
0;
foreach
($readings_time as $reading){
//
Uncomment to set timezone to - 1 hour (you can change 1 to any
number)
$readings_time[$i]
= date("Y-m-d H:i:s", strtotime("$reading - 1
hours"));
//
Uncomment to set timezone to + 4 hours (you can change 4 to any
number)
//$readings_time[$i]
= date("Y-m-d H:i:s", strtotime("$reading + 4
hours"));
$i
+= 1;
}*/
$value
= json_encode(array_reverse(array_column($sensor_data, 'value')),
JSON_NUMERIC_CHECK);
$value_h
= json_encode(array_reverse(array_column($sensor_data, 'value_h')),
JSON_NUMERIC_CHECK);
$recorded
= json_encode(array_reverse($recorded),
JSON_NUMERIC_CHECK);
/*echo
$value1;
echo
$value2;
echo
$value3;
echo
$reading_time;*/
$result->free();
$conn->close();
?>
<!DOCTYPE
html>
<html>
<meta
name="viewport" content="width=device-width,
initial-scale=1">
<script
src="https://code.highcharts.com/highcharts.js"></script>
<style>
body
{
min-width:
310px;
max-width:
1280px;
height:
500px;
margin:
0 auto;
}
h2
{
font-family:
Arial;
font-size:
2.5rem;
text-align:
center;
}
</style>
<body>
<h2>ESP
Weather Station</h2>
<div
id="chart-temperature" class="container"></div>
<div
id="chart-humidity" class="container"></div>
<script>
var
value
= <?php echo $value;
?>;
var
value_h
= <?php echo $value_h;
?>;
var
recorded
= <?php echo $recorded;
?>;
var
chartT = new Highcharts.Chart({
chart:{
renderTo : 'chart-temperature' },
title:
{ text: 'BME280 Temperature' },
series:
[{
showInLegend:
false,
data:
value
}],
plotOptions:
{
line:
{ animation: false,
dataLabels:
{ enabled: true }
},
series:
{ color: '#059e8a' }
},
xAxis:
{
type:
'datetime',
categories:
recorded
},
yAxis:
{
title:
{ text: 'Temperature (Celsius)' }
//title:
{ text: 'Temperature (Fahrenheit)' }
},
credits:
{ enabled: false }
});
var
chartH = new Highcharts.Chart({
chart:{
renderTo:'chart-humidity' },
title:
{ text: 'BME280 Humidity' },
series:
[{
showInLegend:
false,
data:
value_h
}],
plotOptions:
{
line:
{ animation: false,
dataLabels:
{ enabled: true }
}
},
xAxis:
{
type:
'datetime',
//dateTimeLabelFormats:
{ second: '%H:%M:%S' },
categories:
recorded
},
yAxis:
{
title:
{ text: 'Humidity (%)' }
},
credits:
{ enabled: false }
});
</script>
</body>
</html>
Using
canvas.jshttps://canvasjs.com/php-charts/multiseries-chart/
External
access to LAMP serverport 22
(ssh), port 80 (http)
https://howtoraspberrypi.com/enable-mysql-remote-connection-raspberry-pi/
Configure
MySQL to accept external connections to Raspberry Pi
$ sudo
nano /etc/mysql/my.cnf
#bind-address
= 127.0.0.1 <<<<<
comment the line bind-address
optionally
modify
the MySQL port to
reduce risk of attacks, e.g.
port =
8457
$
/etc/init.d/mysql
restart
RasPi
as Samba serverSMB is
the best protocol for use on multiple platforms due to superior
interoperability
in case
of issue “chown: changing ownership of '...': Operation not
permitted”:
https://stackoverflow.com/questions/25559700/chown-command-returning-operation-not-permitted
get
uid:
$ cat
/etc/passwd |grep pi
get
gid:
$ cat
/etc/group |grep pi
Give
pi:pi access to the entire /mnt/usb
mount:
$ sudo
mount -o remount,gid=<pi's
gid>,uid=<pi's
uid>
/mnt/usb
Attention:
FAT
file system doesn't support such permissions, so they can't be
applied after the drive is mounted
Instead,
drive should be formatted with pi user and/or
ntfs file sstem?
Mounting
USB drive that
is
NTFS???-formatted
under specific name:
$ sudo
fdisk
-l
$ sudo
umount /dev/sda1
$ sudo
mkdir /mnt/usb
$ sudo
chown -R pi:pi /mnt/usb
seems
like this command has to be used each time the usb drive is
connected: $
sudo
mount /dev/sda1 /mnt/usb -o uid=pi,gid=pi
append
following text to this file for automatic mounting under the
specified path:
$ sudo
nano /etc/fstab
/dev/sda1
/mnt/usb auto defaults,user 0 1
OR:
/dev/sda1 /mnt/usb ntfs-3g
defaults,user,uid=1000,gid=1000,noatime 0 0
Make
the drive accessible from the network by
adding following text:
$ sudo
apt-get install samba samba-common-bin
$ sudo
nano /etc/samba/smb.conf
[share]
Comment
= Shared Folder
Path
= /mnt/usb
Browseable
= yes
Writeable
= Yes
only
guest = no
create
mask = 0777
directory
mask = 0777
Public
= yes
Guest
ok = yes
$ chmod
1777 /mnt/usb
<<<<
the uSB should be mounted under this name
$ sudo
/etc/init.d/samba restart
sudo
service smbd restart
sudo
service smbd status
https://www.raspberrypi.org/forums/viewtopic.php?t=56149
$ sudo
df
$ cd
/media
$ sudo
mkdir HDD
$ sudo
nano /etc/fstab
/dev/sda1
/media/HDD ntfs-3g defaults,noatime 0 0
$ cp
/etc/samba/smb.conf /etc/samba/smb.conf.bak //Make a backup of the
config file
$ nano
/etc/samba/smb.conf
[media]
comment
= Media share
path =
/media/HDD
valid
users = @users
force
group = users
create
mask = 0660
directory
mask = 0771
read
only = no
sudo
service samba restart
sudo
useradd ChooseUsernameHere -m -G users
sudo
passwd TheChosenUsername //after this choose a password for the new
user
sudo
smbpasswd -a TheChosenUsername //after this enter passwd again
>>>>>>>>>>>
userA pi
mount
in Win10/Linux/etc. as
smb://192.168.178.25/
https://raspberrytips.com/format-mount-usb-drive/
Formatting
USB stick with RasPi:
$ sudo
fdisk -l
$ sudo
fdisk /dev/sda1
Create
a new partition table : g (for GPT, use help for other format)
Create
a new partition : n
You
can keep the default values for a single partition
Confirm
with Y to remove the signature
And
finally write and exit fdisk: w
$ sudo
mkfs.ext4 /dev/sda1
OR:
$ sudo
mkfs.vfat /dev/sda1
OR:
$ sudo
mkfs.ntfs /dev/sda1
$
sudo
mkfs -t vfat -I /dev/sda1
$
sudo
mount /dev/sda1
/mnt/usb
-o umask=000
$
sudo umount /mnt/usb
Filtering
rows with SQLhttps://chartio.com/blog/simple-sql-filtering-rows/
SELECT
column_name1, column_name2
FROM
table_name
WHERE
column_name1 operator value;
SELECT
*
FROM
hello_sensor
WHERE
sensor_num = 0
ORDER
BY `hello_sensor`.`recorded` DESC
Python
MySQLPython
MySQL Querying Datahttps://stackoverflow.com/questions/44634810/fastest-way-to-fetch-table-from-mysql-into-pandas
MyEngine=create_engine('[YourDatabase]://[User]:[Pass]@[Host]/[DatabaseName]',
echo = True)
Downloading:
df =
pd.read_sql_query('select * from [TableName]', con= MyEngine)
Uploading:
df.to_sql([TableName],
MyEngine, if_exists = 'append', index=False)
Using
mysql
modulehttps://www.mysqltutorial.org/python-mysql-query/
https://www.codespeedy.com/fetch-data-from-mysql-table-in-python-program/
https://www.krazyprogrammer.com/2020/11/fetch-and-display-data-from-mysql-using.html
pip
install mysql-connector
https://www.tutorialspoint.com/python_mysql/python_mysql_select_data.htm
import
mysql.connector
#establishing
the connection
conn =
mysql.connector.connect(
user='admin3',
password='pi',
host='192.168.178.25', database='test_arduino'
)
#Creating
a cursor object using the cursor() method
cursor
= conn.cursor()
#Retrieving
single row
query
= '''SELECT * from hello_sensor'''
#Executing
the query
cursor.execute(query)
#Fetching
1st row from the table
result
= cursor.fetchone();
print(result)
#Fetching
first
two
rows
from the table
result
= cursor.fetchmany(size=2);
print(result)
#Fetching
all
rows
from the table
result
= cursor.fetchall();
print(result)
#Closing
the connection
conn.close()
Create
tablehttps://www.tutorialspoint.com/python_mysql/python_mysql_create_table.htm
import
mysql.connector
#establishing
the connection
conn =
mysql.connector.connect(
user='root',
password='password', host='127.0.0.1', database='mydb'
)
#Creating
a cursor object using the cursor() method
cursor
= conn.cursor()
#Dropping
EMPLOYEE table if already exists.
cursor.execute("DROP
TABLE IF EXISTS EMPLOYEE")
#Creating
table as per requirement
sql
='''CREATE TABLE EMPLOYEE(
FIRST_NAME
CHAR(20) NOT NULL,
LAST_NAME
CHAR(20),
AGE
INT,
SEX
CHAR(1),
INCOME
FLOAT
)'''
cursor.execute(sql)
#Closing
the connection
conn.close()
Insert
datahttps://www.tutorialspoint.com/python_mysql/python_mysql_insert_data.htm
import
mysql.connector
#establishing
the connection
conn =
mysql.connector.connect(
user='root',
password='password', host='127.0.0.1', database='mydb'
)
#Creating
a cursor object using the cursor() method
cursor
= conn.cursor()
#
Preparing SQL query to INSERT a record into the database.
insert_stmt
= (
"INSERT
INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)"
"VALUES
(%s, %s, %s, %s, %s)"
)
data =
('Ramya', 'Ramapriya', 25, 'F', 5000)
try:
#
Executing the SQL command
cursor.execute(insert_stmt,
data)
#
Commit your changes in the database
conn.commit()
except:
#
Rolling back in case of error
conn.rollback()
#
Closing the connection
conn.close()
Schedule
periodic RasPi reboothttps://raspberrypi.stackexchange.com/questions/2150/how-do-i-reboot-at-a-specific-time
https://smarthomepursuits.com/how-to-reboot-raspberry-pi-on-a-schedule/
$ sudo
crontab -e
>>>>>
choose nano editor
>>>>>
enter following command at end of file for daily
reboot
at 13:03:
03 13 *
* * /sbin/shutdown -r now
Check
time in Linux commandline:
https://www.lifewire.com/display-date-time-using-linux-command-line-4032698
$ date
Install
KeePasshttps://keepass.info/download.html
https://sourceforge.net/p/keepass/discussion/329220/thread/17d1bd26/
sudo
apt-add-repository ppa:jtaylor/keepass
sudo
apt-get update
sudo
apt-get install keepass2
Clean
the repository of downloaded packagessudo
apt-get
autoclean
sudo
apt-get
clean
cleanup
a /var/log/journal in Linux
How to
tell how much space is being taken?
$
journalctl
--disk-usage
Fix:
Option 3 (RECOMMENDED!):
$
journalctl --vacuum-size=500M
This
will delete old log files until the directory reaches the threshold
size stipulated, in our case, 500M.
Change
permission of mounted drive$
sudo
chmod -R 770 /media/bora/Medien
sudo
mount -o rw,remount /media/bora/Medien
$ mount
-v | grep "^/" | awk '{print "\nPartition identifier:
" $1 "\n Mountpoint: " $3}'
$ sudo
mount -o remount,rw /dev/sda5
/media/bora/Medien
“If
you are on a dual boot system and getting the error related to the
read-only file system. One probable cause could be that your other
system is not correctly shut down and might be in hibernation or
sleep. So login to that system and shut it down properly and religion
to your Linux system. this resolved the issue in my system”