Построение сетевого монитора Raspberry Pi. Мой код не работает

Короче говоря. Я переехал, поставил мой домашний сервер в шкаф и начал беспокоиться о температуре и влажности, увидел руководство онлайн, чтобы сделать монитор температуры и влажности в сети от малины Pi и датчика AM2302, купил датчик малины Pi и AM2302, руководство не было проработав часть, и хотел, чтобы она была зарегистрирована как root, отказалась и решила сделать мое собственное решение.

startup.sh - Я еще не знаю, как я собираюсь начать это. Когда все работает, я хочу, чтобы он регистрировался один раз в день во внутренней памяти.

#!/bin/bash
sleep 10
sudo mkdir -p /ram
sudo mount -t tmpfs -o size=64m tmpfs /ram
sudo chown pi /ram

cp /scripts/dblogger.py /ram
cp /scripts/setupdb.py /ram
cd /ram

python setupdb.py

croncmd="sudo /ram/dblogger.py 2302 4 >> /scripts/job.log 2>&1"
cronjob="* * * * * $croncmd"
( crontab -l | grep -v "$croncmd" ; echo "$cronjob" ) | crontab -

Python setupdb.py

#!/usr/bin/python
import os
import sqlite3
os.chdir("/ram")
conn = sqlite3.connect('climate.db')
c = conn.cursor()
c.execute('CREATE TABLE climatelog ( Date text, Temperature text, Humidity text)')
conn.commit()
conn.close()

dblogger.py - этот запрос является датчиком, регистрирует его в базе данных, запрашивает базу данных и генерирует выходной график. Работает, когда бежит один. Требуется sudo для работы. Я надеюсь установить пороговые значения, поэтому напишите мне в будущем.

#!/usr/bin/python
import sys
import os
import Adafruit_DHT
import sqlite3
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Parse command line parameters.
sensor_args = { '11': Adafruit_DHT.DHT11,
        '22': Adafruit_DHT.DHT22,
        '2302': Adafruit_DHT.AM2302 }

if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

os.chdir("/ram")
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
    print 'Temp={0:0.1f}*F  Humidity={1:0.1f}%'.format(round((temperature*9/5+32), 2), humidity)
    now = datetime.datetime.now()
    con = sqlite3.connect('climate.db')
    c = con.cursor()
    c.execute('INSERT INTO climatelog VALUES (?,?,?)', (now.strftime("%Y-%m-%d %H:%M"), round((temperature*9/5+32), 2), round(humidity, 2)))
    con.commit()
    sql = "SELECT * FROM climatelog"
    # WHERE Date >= strftime('%s','now')-(60*60*24)
    grapharray = []
    for row in c.execute(sql):
        startinginfo = str(row).replace('(','').replace(')','').replace('u\'','').replace("'","")
        splitinfo = startinginfo.split(',')
        grapharrayappend = splitinfo[0]+','+splitinfo[1]+','+splitinfo[2]
        grapharray.append(grapharrayappend)
    datestamp, temp, humidity = np.loadtxt(grapharray,delimiter=',', unpack=True,converters={ 0: mdates.strpdate2num("%Y-%m-%d %H:%M")})
    fig = plt.figure(figsize=(16, 4))
    rect = fig.patch
    axl = fig.add_subplot(1,1,1, axisbg='white')
    plt.plot_date(x=datestamp, y=temp, fmt='r-', label = 'temp', linewidth=2)
    plt.plot_date(x=datestamp, y=humidity, fmt='b-', label = 'humidity', linewidth=2)
    #plt.show()
    plt.savefig('24.png')
    con.close()
else:
    print 'Failed to get reading. Try again!'

Только один работает. Рано вместе и все работает, кроме dblogger.py. Я добавил>>> /scripts/job.log 2> & 1 к команде, вызывающей dblogger.py, чтобы попытаться устранить ее.

job.log - каждую минуту он регистрирует эту ошибку. С изменением температуры и влажности, конечно, немного.

Temp=72.0*F  Humidity=20.8%
Traceback (most recent call last):
  File "/ram/dblogger.py", line 53, in <module>
    fig = plt.figure(figsize=(16, 4))
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 343, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1712, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Я работал над этим, пока я не скрестил глаз. В прошлую пятницу у меня было 0 опыта Python, и мой опыт работы с оболочкой bash был от 2-недельного класса на устаревшей Solaris два с половиной года назад. Я собирался последовать за гидом, но он не работал вообще. Я не знаю, что не так, или как начать поиск проблемы. Я чувствую, что я на 98% до рабочего решения. Есть ли пользователи bash /python /matplotlib, которые могут идентифицировать мою проблему?

Если это не по теме, закройте вопрос. Я отправляюсь в спешке из-за необходимости уйти на работу. Любая помощь приветствуется.

4 голоса | спросил RetsamEvalsEht 24 FebruaryEurope/MoscowbTue, 24 Feb 2015 16:11:07 +0300000000pmTue, 24 Feb 2015 16:11:07 +030015 2015, 16:11:07

2 ответа


4

Если я правильно помню, Tk нужен оконный менеджер, поэтому вам, вероятно, потребуется экспортировать переменную DISPLAY. Попробуйте установить

DISPLAY=:0.0

перед запуском скрипта.

ответил Roberto 24 FebruaryEurope/MoscowbTue, 24 Feb 2015 16:50:22 +0300000000pmTue, 24 Feb 2015 16:50:22 +030015 2015, 16:50:22
3

Благодаря ответу Роберто я начал искать информацию о DISPLAY и той части моей ошибки. Где я нашел эту страницу:

https://stackoverflow.com/questions/2801882 /генерирования-а-PNG-с-Matplotlib-когда дисплей-это-не определено

Для тех, кого это интересует, проблема была в dblogger.py с задней панелью отображения matplotlib.

До:

#!/usr/bin/python
import sys
import os
import Adafruit_DHT
import sqlite3
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

После:

#!/usr/bin/python
import sys
import os
import Adafruit_DHT
import sqlite3
import time
import datetime
import numpy as np

import matplotlib
matplotlib.use('Agg')

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

import matplotlib должен продолжаться matplotlib.use('Agg'), который, в свою очередь, должен продолжить import matplotlib.pyplot в соответствии с предыдущей ссылкой.

ответил RetsamEvalsEht 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 07:17:05 +0300000000amWed, 25 Feb 2015 07:17:05 +030015 2015, 07:17:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132