I have a python code on RaspberryPi 4. If I run It from terminal, It works correctly, but if I want to run It from php code, It not works. What is the problem with It? Why run it correctly in terminal, but not run from php? Thanks.
The python code part 1:
#!/usr/bin/python3
import os
import glob
import time
import board
import Adafruit_DHT
import urllib.request
from urllib.request import urlopen
from datetime import datetime
import socket
import re
import smtplib
from email.message import EmailMessage
#email
def email_alert(subject, body, to):
msg = EmailMessage()
msg.set_content(body)
msg['subject'] = subject
msg['to'] = to
user = "[email protected]"
msg['from'] = user
password = "abcdef"
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(user, password)
server.send_message(msg)
server.quit()
# DECLARATIONS
now = datetime.now() # Get time right now
timestamp = now.strftime("%Y-%m-%d-%H:%M:%S") # Format the timestamp
os.system('modprobe w1-gpio') # Adding 1-wire module to the kernel
os.system('modprobe w1-therm') # Adding 1-wire therm module
base_dir = '/sys/bus/w1/devices/' # Setting the base_dir
device_folder = glob.glob(base_dir + '28*')[0] # Check if a Dallas DS18B20 is connected
device_file = device_folder + '/w1_slave' # This file holds the temperature
#sensor_type = 11 #DHT sensor type 11/22
#sensor_pin = 7 #DHT sensor pin in GPIO
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN = 22 # = GPIO22; az alap a GPIO4
# Initial the dht device, with data pin connected to:
#dhtDevice = adafruit_dht.DHT11(board.D23)
The python code part 2:
# Function to read raw temperature from the DS18b20
# It opens the device_file (/w1_slave), and reads the content, then close the file
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
# Function to read the temperature and format it to Celsius and Fahrenheit
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equal_pos = lines[1].find('t=')
if equal_pos != -1:
temp_string = lines[1][equal_pos+2:]
temp_c = float(temp_string) / 1000.0
global celsius
celsius = temp_c
temp_f = temp_c *9.0 / 5.0 + 32.0
return temp_c, temp_f
# Function that reads the humidity and temperature from the DHT11
# It only saves and use the humidity
#humidity = 75
def read_humidity():
global humidity
#global temperature
#humidity, temperature = Adafruit_DHT.read_retry(sensor_type, sensor_pin)
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
time.sleep(2)
while True:
if humidity is not None and temperature is not None:
#print ('Data from sensor is OK. Humidity= {0:0.1f} %'.format(humidity))
print("Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature, humidity))
if humidity > 100:
read_humidity()
else:
break
else:
print ('Error getting data from DHT.')
# Function to get the local hostname
# It is used for identify the "senor" in the mySQL database
def get_host_name():
global local_hostname
local_hostname = socket.gethostname()
# Function that get the external IP-adress
def get_external_ip_address():
global external_ip
url = "http://checkip.dyndns.org" # This site return one line of text.
my_request = urlopen(url).read() # Read the URL
res = re.findall(b'd{1,3}', my_request) # Search and findall integers in my_request
my_ip_list = list(map(int, res)) # Clean up the list
my_ip = str(my_ip_list)[1:-1] # Remove the square brackets
temp_ip = my_ip.replace(",", ".") # Replace comma with periods
external_ip = temp_ip.replace(" ", "") # Replace <space> with none-space
print ("External IP: " +external_ip) # Print the External IP address as xxx.xxx.xxx.xxx
# Function that actualle sends data and adds it to the database
def send_data():
print (timestamp) # For debug purpose
print (celsius) # For debug purpose
print (humidity) # For debug purpose
print (local_hostname) # For debug purpose
output = "http://example.com/rpi/add_temp.php?temp="+str(celsius)
+"&humi="+str(humidity)+"&time="+str(timestamp)+"&sensor="+str(local_hostname)+"&ip="
+str(external_ip) # This is the string that is called by the urlopen
print (output) # For debug purpose
html = urlopen(output).read() # Actually performing the call
print (html) # For debug purpose
def main():
read_temp()
read_humidity()
get_host_name()
get_external_ip_address()
send_data()
#dhtDevice.exit()
#GPIO.cleanup()
email_alert("Hey", "Hello World", "[email protected]")
#email_alert("Hey", "Hello World", "[email protected]")
if __name__ == "__main__":
main()
The php code:
<?php
// define the GPIO pins for the motor ouptput (Note: PiFace pins start at 200)
$output = shell_exec('/var/www/html/ds18b20_dht_mysql_v01.py 2>&1');
echo "<pre>$output</pre>";
?>
The error message what I get:
Traceback (most recent call last):
File "/var/www/html/ds18b20_dht_mysql_v01.py", line 138, in
main()
File "/var/www/html/ds18b20_dht_mysql_v01.py", line 128, in main
read_humidity()
File "/var/www/html/ds18b20_dht_mysql_v01.py", line 82, in read_humidity
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 81, in read
return platform.read(sensor, pin)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/Raspberry_Pi_2.py", line 34, in read
raise RuntimeError('Error accessing GPIO.')
RuntimeError: Error accessing GPIO.
I can see that the problem is the DHT11 temp sensor code. But I dont understand why work it in terminal and why not works it from php.