annotate service/irRemote/irRemote.py @ 1754:92999dfbf321 default tip

add shelly support
author drewp@bigasterisk.com
date Tue, 04 Jun 2024 13:03:43 -0700
parents b9102d13f0a6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
327
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
1 #!/usr/bin/env python
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
2
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
3 # Read lirc output, in order to sense key presses on an IR remote.
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
4 # There are various Python packages that claim to do this but
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
5 # they tend to require elaborate setup and I couldn't get any to work.
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
6 # This approach requires a lircd.conf but does not require a lircrc.
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
7 # If irw works, then in theory, this should too.
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
8 # Based on irw.c, https://github.com/aldebaran/lirc/blob/master/tools/irw.c
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
9
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
10
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
11 import socket
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
12 import logging
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
13 import requests
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
14 from rdflib import Graph, Namespace
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
15
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
16 ROOM = Namespace("http://projects.bigasterisk.com/room/")
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
17 SOCKPATH = "/var/run/lirc/lircd"
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
18
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
19 logging.basicConfig(level=logging.INFO)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
20 log = logging.getLogger()
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
21
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
22 class Listener:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
23 def __init__(self):
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
24 self.lastKey = None, None
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
25 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
26 log.info('starting up on %s', SOCKPATH)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
27 self.sock.connect(SOCKPATH)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
28
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
29 def run(self):
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
30 while True:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
31 keyname, updown = self.next_key()
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
32 log.debug('%r (%r)', keyname, updown)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
33 if self.lastKey[0] is None or (
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
34 keyname == self.lastKey[0] and
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
35 updown < self.lastKey[1]):
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
36 g = Graph()
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
37 g.add((ROOM['remoteButton/%s' % keyname],
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
38 ROOM['state'],
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
39 ROOM['press']))
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
40 nt = g.serialize(format='n3')
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
41 resp = requests.post('http://bang6:9071/oneShot', headers={
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
42 'Content-Type': 'text/n3',
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
43 'user-agent': 'irRemote',
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
44 }, data=nt)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
45 log.info('new press: %r', keyname)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
46 if resp.status_code != 200:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
47 log.warning('reasoning responded with %s. %r',
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
48 resp.status_code, resp.__dict__)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
49 self.lastKey = keyname, updown
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
50
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
51 def next_key(self):
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
52 '''Get the next key pressed. Return keyname, updown.
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
53 '''
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
54 while True:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
55 data = self.sock.recv(128)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
56 # print("Data: " + data)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
57 data = data.strip()
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
58 if data:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
59 break
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
60
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
61 words = data.split()
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
62 try:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
63 return words[2].decode('ascii'), int(words[1], 16)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
64 except:
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
65 log.warning('failed on %r', data)
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
66 raise
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
67
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
68 if __name__ == '__main__':
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
69 Listener().run()
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
70
b9102d13f0a6 start lirc client
drewp@bigasterisk.com
parents:
diff changeset
71