# HG changeset patch # User drewp # Date 1517030602 28800 # Node ID e514337f202ecf534c6d03266b79846bedb38ad4 # Parent f2e1f28c2efb4b1400c972b483136539f1fdf8fb start lirc client Ignore-this: 79a3a12109296a833877a00f3a412d31 darcs-hash:5dfd32b28b4c4e3c82df5180860dc4b372fe9fc7 diff -r f2e1f28c2efb -r e514337f202e service/irRemote/irRemote.py --- /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() + + diff -r f2e1f28c2efb -r e514337f202e service/irRemote/requirements.txt --- /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 +