2017-04-23 1 views
0

Je me bats avec ce code depuis des jours pour qu'il affiche des notifications sur un bureau Raspbian Jessie. J'ai essayé Notify, notify2, et notify-send et ils travaillent tous à partir de IDLE mais pas à partir de la ligne de commande. Notifier planté le code python, notifier-envoyer (appelé via subprocess.Popen) n'a rien fait (fonctionne très bien lorsqu'il est appelé directement depuis le terminal), notify2 a travaillé pendant un certain temps depuis la ligne de commande après avoir exécuté IDLE mais cesse de fournir des notifications. Aucune erreur n'est jamais donnée. J'utilise le système de notification car le système peut mettre plus de 10 secondes à démarrer le flux de la caméra rtsp une fois le bouton poussé et je veux que l'utilisateur sache que son entrée a été reçue. S'il y a une autre façon d'afficher une notification rapide à partir de Python, je suis ouvert aux idées (tkinter?).Notify2 fonctionne à partir de Python3 IDLE mais pas toujours dans le terminal

code

est appelé à partir d'un script bash appelé LXDE-pi/Autostart:

#!/bin/sh 
# launcher.sh 
cd/
cd home/pi/py_switch 
while true; do 
      python3.4 buttons.py 
      echo -----------------------RESTARTING CODE------------ 
     done 
cd/

Voici buttons.py:

#!/usr/bin/env python 
import RPi.GPIO as GPIO 
import time 
import schedule 
import subprocess 
import os 
from subprocess import call 
import notify2 
import sys; print(sys.executable) 
print(os.getcwd()) 
notify2.init("Buttons") 

os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority') 
os.environ.setdefault('DISPLAY', ':0.0') 
GPIO.setmode(GPIO.BCM) 

GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP) #* 
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) #MIC 
GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP) #CAM 
GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP) #BRIGHTNESS 
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) #POWER 


input_state1 = GPIO.input(26) 
input_state2 = GPIO.input(19) 
input_state3 = GPIO.input(13) 
input_state4 = GPIO.input(6) 
input_state5 = GPIO.input(5) 
print(time.asctime(time.localtime(time.time()))) 
print('Button State: ', input_state1, input_state2, input_state3, input_state4, input_state5) 
cam_state=False 

n = notify2.Notification("Buttons!", "Waiting for you to push something.") 
n.show() 
brightness = str(subprocess.check_output(["ddcutil", "getvcp", "10"])) 
brightness = brightness[brightness.find('=',4):brightness.find(',')] 
brightness = brightness[1:].strip(' ') 
if brightness == '0': 
    disp_state=1 
    print('Startup brightness is 0%') 
elif brightness == '1': 
    disp_state=0 
    print('Display is off') 
else: 
    disp_state=2 
    print('Startup brightness is >0%') 

def job(): 
    rc = subprocess.call(["/home/pi/py_switch/cams.sh", "repair"]) 
    print('Checking for down cameras') 

def night(): 
    rc = subprocess.call(["ddcutil", "setvcp", "10", "1"]) 
    rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "04"]) 
    disp_state=0 
    print('Starting night mode') 

def day(): 
    rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "01"]) 
    rc = subprocess.call(["ddcutil", "setvcp", "10", "100"]) 
    disp_state=2 
    print('Starting day mode') 

schedule.every().day.at("23:30").do(night) 
schedule.every().day.at("06:00").do(day) 
schedule.every().wednesday.at("07:15").do(night) 
schedule.every().thursday.at("07:15").do(night) 

while True: 
    input_state1 = GPIO.input(26) #* 
    input_state2 = GPIO.input(19) #MIC 
    input_state3 = GPIO.input(13) #CAM 
    input_state4 = GPIO.input(6) #BRIGHTNESS 
    input_state5 = GPIO.input(5) #POWER 

    if input_state3 == False: 
     print('Camera Button Pressed') 
     time.sleep(0.2) 
     if cam_state == False: 
      n = notify2.Notification("Starting Cameras", "May take up to 10 seconds...", "camera-video") 
      rc = subprocess.call(["/home/pi/py_switch/cams.sh", "repair"]) #repair like start but won't double start if running 
      cam_state=True 
      schedule.every(3).minutes.do(job).tag('repair-cams') 
     else: 
      n = notify2.Notification("Stopping Cameras", "Standby...", "camera-video") 
      rc = subprocess.call(["/home/pi/py_switch/cams.sh", "stop"]) 
      cam_state=False 
      schedule.clear('repair-cams') 
    if input_state4 == False: 
     print('Brightness button Pressed') 
#  rc = subprocess.Popen('DISPLAY=:0 notify-send "Changing Brightness..." "100% -> 0% -> Off ->" -i dialog-information', shell=True) 
     n = notify2.Notification("Changing brightness", "100% -> 0% -> Off ->", "dialog-information") 
     time.sleep(0.2) 
     if disp_state == 3: 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "50"]) 
       disp_state=2 
     elif disp_state == 2: 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "0"]) 
       disp_state=1 
     elif disp_state == 1: 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "1"]) 
       rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "04"]) 
       disp_state=0 
     elif disp_state == 0: 
       rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "01"]) 
       rc = subprocess.call(["ddcutil", "setvcp", "10", "100"]) 
       disp_state=2 #changed to 2 to from 3 to bypass 50% brighness 
    if input_state5 == False: 
     print('Power button Pressed') 
     start = time.time() 
     time.sleep(0.2) 
#  rc = subprocess.Popen('DISPLAY=:0 notify-send "Hold for 5s to shutdown." -i system-shutdown', shell=True) 
     n = notify2.Notification("Shutdown?", "Hold for 5s to shutdown.", "system-shutdown") 
     while input_state5 == False: 
      time.sleep(0.1) 
      print('Holding down 3') 
      end = time.time() 
      press_time = end-start 
      # print(press_time) 
      input_state5 = GPIO.input(5) 
      if press_time > 5: 
       print('Shutting down?') 
       os.system('sudo shutdown -h now') 

    if input_state2 == False: 
     print('Microphone button Pressed') 
     time.sleep(0.2) 
     #rc = subprocess.call(["ddcutil", "setvcp", "10", "100"]) 
    if input_state1 == False: 
     print('Star button Pressed') 
     time.sleep(0.2) 
    time.sleep(0.1) 
    schedule.run_pending() 

Est-ce que je dois faire quelque chose de spécial pour maintenir la notification démon en cours d'exécution? Je notification-daemon, informez-osd et sur tous les autres paquets recherches Google suggéré installer:

(zcat $(ls -tr /var/log/apt/history.log*.gz); cat /var/log/apt/history.log) 2>/dev/null | 
    egrep '^(Start-Date:|Commandline:)' | 
    grep -v aptdaemon | 
    egrep -B1 '^Commandline:' 
Commandline: apt-get install notification-daemon 
Commandline: apt-get install python-notify 
Commandline: apt-get install python-dev python-rpi.gpio 
Commandline: apt-get install python-gobject libnotify-bin libnotify-dev 
Commandline: apt-get install xorg-dev libglu1-mesa-dev 
Commandline: apt-get install libudev-dev 
Commandline: apt-get install libusb-dev 
Commandline: apt-get install libusb-1.0.0-dev 
Commandline: apt-get install screen 
Commandline: apt-get install xosd-bin 
Commandline: apt-get install libgtk2.0-dev libglib2.0-dev libnotify-dev 
Commandline: apt-get install libnotify-cil-dev 
Commandline: apt-get install notify-osd 
Commandline: apt-get install unclutter 
Commandline: apt-get install python3-notify2 

Répondre

0

Le code affiché dans la question a fonctionné par intermittence, mais n'a pas causé aucun message d'erreur. J'ai essayé d'ajouter l'établissement de l'urgence à critique (n.set_urgency(notify2.URGENCY_CRITICAL)), mais cela n'a pas aidé.

J'ai trouvé qu'en appelant notify-send en utilisant --urgency=critical la notification apparaît de manière fiable.

Exemple de travail:

rc = subprocess.Popen('DISPLAY=:0 notify-send --urgency=critical "Changing Brightness..." "100% -> 0% -> Off ->" -i dialog-information', shell=True)