Как исправить проблему crontab или 'os.execute()' с помощью скрипта Python?
Я запускаю domoticz на PI3b с Raspbian, для большей эффективности у PI3b теперь есть 7-дюймовый экран, чтобы показать поведение домашней сети + информацию о метеостанции + интернет-прогноз... Чтобы показать все это, я написал приложение C++/WXWidget с графика для температуры / давления... Графики температуры / давления с графиком Python3/matplotlib сохраняются в виде 3 файлов PNG.Сценарий Python считывает данные в файлах и строит / сохраняет графики.
Это работает хорошо из терминала.... но нет способа работать с crontab или с "os.execute()" из событий lua-scripts of domoticz...
Я выдвинул все разрешения / доступ для сценариев и файлов PNG (чтение / запись)
Один скрипт python считывает данные с датчика bme280, crontab 2 минуты, нет проблем, он работает с терминала, crontab, lua events...
Второй скрипт читает данные, строит графики и отправляет команду http json, чтобы обновить устройство в domoticz. Это прекрасно работает из терминала, но не из Domoticz (lua os.execute()) или из crontab.
позвоните в crontab: sudo /usr/bin/python3 /home/pi/Desktop/graph.py
вызов из сценария domoticz lua: os.execute('sudo /usr/bin/python3 /home/pi/Desktop/graph.py')
из терминала он отлично работает с python, / usr / bin / python или /usr/bin/python3 (-> matplotlib)
python --version = 3.7.0
Похоже проблема между многими версиями Python, хорошая не вызывается из crontab и lua-scripts.... Как это исправить?
версия Python по умолчанию 2.7.0, 3.0, 3.6, 3.7 протестирована для проверки проблемы с env/bin/path... единственная проблема, найденная с urllib.urlopen, изменена на "urlopen from urllib.request"
#!/usr/bin/python3
import matplotlib.lines as lines
import matplotlib.pyplot as plt
#import urllib ---> urllib.urlopen() works with /usr/bin/python
from urllib.request import urlopen #---> to work with /usr/bin/python3
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid(which='major', axis='x', color=(0.6, 0.6, 0.6), linewidth=1)
ax.patch.set_color('black')
fig.set_facecolor((0.0, 0.0, 0.0))
fig.set_size_inches(26.25, 7.42)
fig.patch.set_facecolor('black')
ax.spines["top"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["left"].set_visible(False)
plt.ylim(0, 63)
plt.xlim(0, 210)
plt.style.use('dark_background')
list = []
d1 = 0
d2 = 0
d3 = 0
def readf( str ): #open/read file, fill the list
list[:] = []
with open(str) as infile: #parsing to float
numbers = infile.read()
numbers = numbers.replace(" ","").replace("\r","").replace("\n","")
for num in numbers.split(";"):
n = float(num)
list.append(n)
infile.close()
if str == "/home/pi/Dev/PI-Weather_Station/pressval.txt":
t = len(list) - 1
t1 = t - 6
t2 = t - 12
t3 = t - 24
d1 = list[t] - list[t1]
d2 = list[t] - list[t2]
d3 = list[t] - list[t3]
if d1 < 0 and d2 < 0:
httpresponse = urlopen("http://192.168.x.xxx:xxxx/json.htm?type=command¶m=updateuservariable&vname=tendance&vtype=2&vvalue=baisse")
elif d1 < 0 and d2 > 0:
httpresponse = urlopen("http://192.168.x.xxx:xxxx/json.htm?type=command¶m=updateuservariable&vname=tendance&vtype=2&vvalue=stable")
elif d1 > 0 and d2 > 0:
httpresponse = urlopen("http://192.168.x.xxx:xxxx/json.htm?type=command¶m=updateuservariable&vname=tendance&vtype=2&vvalue=hausse")
elif d1 > 0 and d2 < 0:
httpresponse = urlopen("http://192.168.x.xxx:xxxx/json.htm?type=command¶m=updateuservariable&vname=tendance&vtype=2&vvalue=stable")
return;
def chart( stg ): #plot/save the charts
o = len(list)
omin = 1400
omax = -50
i = 0
n = 0
line = lines.Line2D([i, i+1], [list[i], list[i+1]], lw=1, color='blue', axes=ax)
if o > 210:
i = o - 210
n = i
while i < o-1:
if stg == "/home/pi/Dev/PI-Weather_Station/tex.png":
line = lines.Line2D([i, i+1], [list[i], list[i+1]], lw=3, color=(0.0, 0.7, 1.0), axes=ax)
ax.add_line(line)
elif stg == "/home/pi/Dev/PI-Weather_Station/tin.png":
line = lines.Line2D([i, i+1], [list[i], list[i+1]], lw=3, color='yellow', axes=ax)
ax.add_line(line)
elif stg == "/home/pi/Dev/PI-Weather_Station/press.png":
line = lines.Line2D([i, i+1], [list[i], list[i+1]], lw=3, color='red', axes=ax)
ax.add_line(line)
if list[i] < omin:
omin = list[i]
if list[i] > omax:
omax = list[i]
i += 1
ax.axis([n, o, omin - 0.1, omax + 0.1])
ax.axhline((omax+omin)/2, 0, 1)
ax.axvline(n+30, 0, 1)
ax.axvline(n+60, 0, 1)
ax.axvline(n+90, 0, 1)
ax.axvline(n+120, 0, 1)
ax.axvline(n+150, 0, 1)
ax.axvline(n+180, 0, 1)
fig.savefig(stg, dpi = 10, bbox_inches = 'tight')
return;
readf("/home/pi/Dev/PI-Weather_Station/texval.txt")
chart("/home/pi/Dev/PI-Weather_Station/tex.png")
readf("/home/pi/Dev/PI-Weather_Station/tinval.txt")
chart("/home/pi/Dev/PI-Weather_Station/tin.png")
readf("/home/pi/Dev/PI-Weather_Station/pressval.txt")
chart("/home/pi/Dev/PI-Weather_Station/press.png")
plt.close()
1 ответ
Oky,
source: генерация PNG с помощью matplotlib, когда DISPLAY не определен
это был pb с matplotlib, скрипт отлично работает в терминале, но для других ему нужно больше кодов:
#!/usr/bin/python
import matplotlib
matplotlib.use('Agg')