Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.8k views
in Technique[技术] by (71.8m points)

android - Raspberry Pi 4 python code not run from php

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

In your method read_humidity() is a call to itself. Is causes a circular reference...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...