changeset 1132:e514337f202e

start lirc client Ignore-this: 79a3a12109296a833877a00f3a412d31 darcs-hash:5dfd32b28b4c4e3c82df5180860dc4b372fe9fc7
author drewp <drewp@bigasterisk.com>
date Fri, 26 Jan 2018 21:23:22 -0800
parents f2e1f28c2efb
children 114ca7fd9d01
files service/irRemote/irRemote.py service/irRemote/requirements.txt
diffstat 2 files changed, 78 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/irRemote/irRemote.py	Fri Jan 26 21:23:22 2018 -0800
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+# Read lirc output, in order to sense key presses on an IR remote.
+# There are various Python packages that claim to do this but
+# they tend to require elaborate setup and I couldn't get any to work.
+# This approach requires a lircd.conf but does not require a lircrc.
+# If irw works, then in theory, this should too.
+# Based on irw.c, https://github.com/aldebaran/lirc/blob/master/tools/irw.c
+
+
+import socket
+import logging
+import requests
+from rdflib import Graph, Namespace
+
+ROOM = Namespace("http://projects.bigasterisk.com/room/")
+SOCKPATH = "/var/run/lirc/lircd"
+
+logging.basicConfig(level=logging.INFO)
+log = logging.getLogger()
+
+class Listener:
+    def __init__(self):
+        self.lastKey = None, None
+        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+        log.info('starting up on %s', SOCKPATH)
+        self.sock.connect(SOCKPATH)
+
+    def run(self):
+        while True:
+            keyname, updown = self.next_key()
+            log.debug('%r (%r)', keyname, updown)
+            if self.lastKey[0] is None or (
+                    keyname == self.lastKey[0] and
+                    updown < self.lastKey[1]):
+                g = Graph()
+                g.add((ROOM['remoteButton/%s' % keyname],
+                       ROOM['state'],
+                       ROOM['press']))
+                nt = g.serialize(format='n3')
+                resp = requests.post('http://bang6:9071/oneShot', headers={
+                    'Content-Type': 'text/n3',
+                    'user-agent': 'irRemote',
+                }, data=nt)
+                log.info('new press: %r', keyname)
+                if resp.status_code != 200:
+                    log.warning('reasoning responded with %s. %r',
+                                resp.status_code, resp.__dict__)
+            self.lastKey = keyname, updown
+        
+    def next_key(self):
+        '''Get the next key pressed. Return keyname, updown.
+        '''
+        while True:
+            data = self.sock.recv(128)
+            # print("Data: " + data)
+            data = data.strip()
+            if data:
+                break
+
+        words = data.split()
+        try:
+            return words[2].decode('ascii'), int(words[1], 16)
+        except:
+            log.warning('failed on %r', data)
+            raise
+
+if __name__ == '__main__':
+    Listener().run()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/irRemote/requirements.txt	Fri Jan 26 21:23:22 2018 -0800
@@ -0,0 +1,7 @@
+certifi==2018.1.18
+chardet==3.0.4
+idna==2.6
+isodate==0.6.0
+rdflib==4.2.2
+requests==2.18.4
+