blob: 270780a50d9d2d9e9c89926f65513f2de39e27ff (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
(module smart-relay racket/base
(require mqtt-client)
(provide main)
(define (make-send-to-dev data)
(lambda (dev)
(with-output-to-file dev
#:exists 'truncate
#:mode 'binary
(lambda ()
(write-bytes data)))))
(define send-message-on
(make-send-to-dev (bytes #xA0 #x01 #x01 #xA2)))
(define send-message-off
(make-send-to-dev (bytes #xA0 #x01 #x00 #xA1)))
(define (make-toggle-relay dev)
(let ((turn-on? #t))
(lambda ()
(displayln (format "Relay on ~a toggled" dev))
(if turn-on?
(send-message-on dev)
(send-message-off dev))
(set! turn-on? (not turn-on?)))))
(define (main #:host [host "localhost"]
#:username [username #f]
#:password [password #f]
#:client-name [client-name "smart-relay"]
#:topic-name [topic-name "hsp/bobma/smart-relay"]
#:relay-dev [relay-dev "/dev/ttyUSB0"])
(define toggle-relay (make-toggle-relay relay-dev))
(mqtt/with-client (host client-name)
(mqtt/with-connection (#:keep-alive-interval 20
#:clean-session #t
#:username username
#:password password)
(mqtt/subscribe topic-name)
(let loop ()
(mqtt/with-message-recv (topic payload)
(displayln (format "Message \"~a\" recieved on topic \"~a\"" payload topic))
(cond
((string=? (bytes->string/utf-8 payload)
"toggle")
(toggle-relay))))
(loop))))))
|