changed temp/photo listener to sensor listener
[svn42.git] / door_daemon.py
index 8df0761..f17083b 100755 (executable)
@@ -9,32 +9,38 @@ import time
 import signal
 import re
 import socket
+import serial
 
-logging.basicConfig(level=logging.INFO,filename='/var/log/tuer.log',format="%(asctime)s %(message)s",datefmt="%Y-%m-%d %H:%M")
+logging.basicConfig(level=logging.INFO,filename='/var/log/tmp/tuer.log',format="%(asctime)s %(message)s",datefmt="%Y-%m-%d %H:%M")
 
 class StatusDisplay():
   def __init__(self):
-    self.url_open = 'https://www.realraum.at/cgi/status.cgi?pass=jako16&set=%3Chtml%3E%3Cbody%20bgcolor=%22lime%22%3E%3Ch3%3E%3Ccenter%3ETuer%20ist%20Offen%3C/center%3E%3C/h3%3E%3C/body%3E%3C/html%3E';
-    self.url_closed = 'https://www.realraum.at/cgi/status.cgi?pass=jako16&set=%3Chtml%3E%3Cbody%20bgcolor=%22red%22%3E%3Ch3%3E%3Ccenter%3ETuer%20ist%20Geschlossen%3C/center%3E%3C/h3%3E%3C/body%3E%3C/html%3E';
+    self.url_open = 'https://www.realraum.at/cgi/status.cgi?pass=jako16&set=%3Chtml%3E%3Cbody%20bgcolor=%22lime%22%3E%3Ccenter%3E%3Cb%3ET%26uuml%3Br%20ist%20Offen%3C/b%3E%3C/center%3E%3C/body%3E%3C/html%3E'
+    self.url_closed = 'https://www.realraum.at/cgi/status.cgi?pass=jako16&set=%3Chtml%3E%3Cbody%20bgcolor=%22red%22%3E%3Cb%3E%3Ccenter%3ET%26uuml%3Br%20ist%20Geschlossen%3C/center%3E%3C/b%3E%3C/body%3E%3C/html%3E'
     self.last_status_set=""
     #object.__init__(self)
     
   def display_open(self):
     if self.last_status_set != self.url_open:
       self.last_status_set=self.url_open
-      #print "accessing %s\n" % self.last_status_set
-      f = urllib.urlopen(self.last_status_set)
-      f.read()
-      f.close()
-    
+      try:
+        #print "accessing %s\n" % self.last_status_set
+        f = urllib.urlopen(self.last_status_set)
+        f.read()
+        f.close()
+      except:
+        pass
+
   def display_closed(self):
     if self.last_status_set != self.url_closed:
       self.last_status_set=self.url_closed
-      #print "accessing %s\n" % self.last_status_set
-      f = urllib.urlopen(self.last_status_set)
-      f.read()
-      f.close()
-
+      try:
+        #print "accessing %s\n" % self.last_status_set
+        f = urllib.urlopen(self.last_status_set)
+        f.read()
+        f.close()
+      except:
+        pass
 
 class ArduinoUSBThread ( threading.Thread ):
   def __init__(self, file_dev_ttyusb):
@@ -47,28 +53,25 @@ class ArduinoUSBThread ( threading.Thread ):
     self.running=True
     self.lastline=""
     self.last_status=None
+    self.shortsleep = 0
     self.cv_updatestatus = threading.Condition(); #lock ist automatically created withing condition
     self.file_dev_ttyusb=file_dev_ttyusb
-    #self.fh = open(self.file_dev_ttyusb,"w+")
-    self.fh = os.fdopen(os.open(self.file_dev_ttyusb, os.O_RDWR | os.O_NONBLOCK),"r+") 
+    self.dev = serial.Serial(port=file_dev_ttyusb, baudrate=9600,timeout=60)
     #pythons sucks just like perl: we need nonblock or we can't write to FileHandle while we block reading on same filehandle
     self.statusdisplay = StatusDisplay()
     threading.Thread.__init__(self)
     
   def stop(self):
     self.running=False
-    self.fh.close()
-    if (self.fh):
-      self.fh.close()
+    if (self.dev.isOpen()):
+      self.dev.close()
 
   def send_open(self):
     self.send_statusrequest()
     self.cv_updatestatus.acquire()
     if self.re_isidle.search(self.lastline):
       logging.info("Opening Door")
-      print("\nSending o..")
-      self.fh.write("o");
-      print("done\n")
+      self.dev.write("o");
     self.cv_updatestatus.release()
     
   def send_close(self):
@@ -76,43 +79,35 @@ class ArduinoUSBThread ( threading.Thread ):
     self.cv_updatestatus.acquire()
     if self.re_isidle.search(self.lastline):
       logging.info("Closing Door")
-      print("\nSending c..")
-      self.fh.write("c");
-      print("done\n")
+      self.dev.write("c");
     self.cv_updatestatus.release()
       
   def send_toggle(self):
     self.send_statusrequest()
     self.cv_updatestatus.acquire()
-    if self.last_status == "open":
-      self.cv_updatestatus.release()
-      self.send_close()
-    elif self.last_status == "closed":
-      self.cv_updatestatus.release()
-      self.send_open()
-    else:
-      self.cv_updatestatus.release()
-      
+    if self.re_isidle.search(self.lastline):
+      logging.info("Toggling Door")
+      self.dev.write("t");
+    self.cv_updatestatus.release()
+    
   def send_reset(self):
-    logging.info("Resetting Door")
-    print("\nSending r..")
-    self.fh.write("r");
-    print("done\n")
+    self.shortsleep = 20
+    logging.info("Resetting Door")    
+    self.dev.write("r");
 
   def send_statusrequest(self):
-    print("\nSending s..")
-    self.fh.write("s");
-    print("done\n")
+    self.shortsleep = 20
+    self.dev.write("s");
     self.cv_updatestatus.acquire()
     self.cv_updatestatus.wait(5.0)
     self.cv_updatestatus.release()        
 
   def run (self):
-    while (self.running and self.fh):
-      try:
-        line = self.fh.readline();
-      except IOError, e:
-        time.sleep(0.5)
+    if not self.dev.isOpen():
+      self.dev.open()
+    while (self.running and self.dev.isOpen()):
+      line = self.dev.readline()
+      if len(line) == 0:
         continue
       self.cv_updatestatus.acquire()
       self.lastline=line.strip()
@@ -130,8 +125,8 @@ class ArduinoUSBThread ( threading.Thread ):
           self.send_reset()
       self.cv_updatestatus.notifyAll()
       self.cv_updatestatus.release()
-    if self.fh:
-      self.fh.close()
+    if self.dev.isOpen():
+      self.dev.close()
 
 class ControlFIFOThread ( threading.Thread ):
   def __init__(self, file_fifo, arduino):
@@ -143,7 +138,7 @@ class ControlFIFOThread ( threading.Thread ):
   
   def stop(self):
     self.running=False
-    self.fh.close()
+    self.dev.close()
   
   def run (self):
     self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
@@ -156,7 +151,6 @@ class ControlFIFOThread ( threading.Thread ):
     while (self.running):
       self.socketconn, addr = self.socket.accept()
       self.conn = os.fdopen(self.socketconn.fileno())
-      print "a"
       while 1:
         #~ line=""
         #~ while 1:
@@ -169,7 +163,6 @@ class ControlFIFOThread ( threading.Thread ):
         line=self.conn.readline()
         if not line:
           break
-        print "f"
         m = self.re_cmd.match(line)
         if not m is None:
           (cmd,who) = m.group(1,2)
@@ -192,7 +185,6 @@ class ControlFIFOThread ( threading.Thread ):
             logging.info(who)
           else:
             logging.info("Invalid Command %s %s" % (cmd,who))
-      print "c"
       self.conn.close()
       self.socketconn.close()
     if self.socket:
@@ -224,4 +216,4 @@ signal.signal(signal.SIGQUIT, exit_handler)
 
 logging.info("Door Daemon started")
 arduino.join()
-ctrlfifo.join()
\ No newline at end of file
+ctrlfifo.join()