Here is how you get Nanoleaf Canvas Touch Events sent to openHab items.
.items
Group:Number canvasTouch
Number CanvasTouchId (canvasTouch)
Number CanvasTouchGesture (canvasTouch)
.rules
rule "Nanoleaf touch"
when
Member of canvasTouch received update
then
logInfo("CanvasTouch", triggeringItem.name + " State=" + triggeringItem.state)
switch(triggeringItem.name) {
case "CanvasTouchId":{
logInfo("CanvasTouch", "PanelId=" + triggeringItem.state + " gesture=" + CanvasTouchGesture.state)
switch(triggeringItem.state) {
case 22092: {
CanvasKitchenPower.sendCommand(if (CanvasKitchenPower.state==ON) OFF else ON)
if (CanvasKitchenPower.state==OFF) {
CanvasKitchenColor.sendCommand(100)
CanvasKitchenEffect.sendCommand("Fray")
}
}
case 15141: {
CanvasKitchenColor.sendCommand(25)
CanvasKitchenEffect.sendCommand("WhiteDimmed")
}
}
}
default: {
}
}
end
nanoleafTouches.py
# -*- coding: utf-8 -*-
import requests
import logging
import json
logging.basicConfig(filename='/home/omr/nanoleafTouches.log', level=logging.DEBUG, format='%(asctime)s %(message)s')
logging.info("Started")
canvasIP='192.168.1.12:16021'
canvasToken='snJIIotZTyLiBomN2Lym6PHvH5pUkHkd'
canvasEvent='/events?id=4' # touch
openHabIp='localhost:8080'
openhabGestureItem='/rest/items/CanvasTouchGesture'
openhabIdItem='/rest/items/CanvasTouchId'
canvasGetUrl='http://'+canvasIP+'/api/v1/'+canvasToken+canvasEvent
openHabPostUrlGesture='http://'+openHabIp+openhabGestureItem
openHabPostUrlId='http://'+openHabIp+openhabIdItem
headersGET = { 'Accept': 'application/json', 'Content-Type': 'application/json', }
headersPOST = { 'Accept': 'application/json', 'Content-Type': 'text/plain', }
#print(canvasGetUrl)
#print(openHabPostUrlGesture)
#print(openHabPostUrlId)
def connectToCanvas():
global response
global rr
global newlineSeen
response = requests.get(canvasGetUrl, headers=headersGET, stream=True)
logging.info('Listening...')
rr=''
newlineSeen=False
def parseEvent():
global rr
rr=rr[12:] # throw away no JSON part (is always id=4)
logging.info(rr)
loaded_json = json.loads(rr)
gesture=loaded_json['events'][0]['gesture']
panelId=loaded_json['events'][0]['panelId']
# print(gesture)
# print(panelId)
res1=requests.post(openHabPostUrlGesture, headers=headersPOST, data=str(gesture))
res2=requests.post(openHabPostUrlId, headers=headersPOST, data=str(panelId))
def rxEvent():
global response
global rr
global newlineSeen
r=response.raw.read(1) # parse every single byte received until /n/n
if len(r) == 0:
connectToCanvas() # connection was lost, re-connect
else:
if newlineSeen:
if r == '\n':
parseEvent()
newlineSeen=False
rr='' # start over
else:
newlineSeen=False
rr=rr+r # accumulate
else:
if r == '\n':
newlineSeen=True
rr=rr+' ' # replace \n with ' '
else:
rr=rr+r # accumulate
connectToCanvas()
while True:
# typical response:
# id: 4\ndata: {"events":[{"panelId":42794,"gesture":0}]}\n\n
rxEvent()
# never stop listening
.log (.py)
2019-06-25 23:06:39,093 Starting new HTTP connection (1): 192.168.1.12
2019-06-25 23:06:52,721 Started
2019-06-25 23:06:52,727 Starting new HTTP connection (1): 192.168.1.12
2019-06-25 23:06:52,741 "GET /api/v1/snJIIotZTyLiBomN2Lym6PHvH5pUkHkd/events?id=4 HTTP/1.1" 200 None
2019-06-25 23:06:52,742 Listening...
2019-06-25 23:07:39,429 {"events":[{"panelId":15141,"gesture":0}]}
.log (oh2)
2019-06-25 23:07:39.443 [INFO ] [e.smarthome.model.script.CanvasTouch] - CanvasTouchGesture State=0
2019-06-25 23:07:39.448 [INFO ] [e.smarthome.model.script.CanvasTouch] - CanvasTouchId State=15141
2019-06-25 23:07:39.450 [INFO ] [e.smarthome.model.script.CanvasTouch] - PanelId=15141 gesture=0
.service
[Unit]
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python /home/omr/nanoleafTouches.py
StandardInput=tty-force
[Install]
WantedBy=default.target