domo.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # -*- coding: utf-8 -*-
  2. from __future__ import print_function, absolute_import, division, unicode_literals
  3. import os
  4. import logging
  5. from timeit import default_timer
  6. from random import choice
  7. import time
  8. import requests
  9. from ameise import app, ask, log
  10. from flask_ask import Ask, statement, question, session, context
  11. ALEXA_DEVICE2ROOM = {
  12. 'amzn1.ask.device.AGUM4ZB75QPFGNC5X2TYPIACRGBGQJUG7W3EJYVOG7W46XYQLQJNH3OJAUYPRZKMWDDE2UJGFJWSWCM27F4D22LD2PC6T3CAZEJB5ZQPIBY6NA32MIITTNUCTUL5SOIV5RDC2HWHI6UJRN77G7CFT2TPZB6A':
  13. 'arbeitszimmer',
  14. 'amzn1.ask.device.AGUM4ZB75QPFGNC5X2TYPIACRGBPSS5LVRD657YFVYBPGW2VGO2TZTHMZVAUBLBDSBKCTZ5P5MOXX5S5DLDEKPQAIOSQLQOI2SXIF2X6HT5GMJELOUNWZEXNM44SCT4CQBNTC73WDCW3KNX75PFXNFR7GRVA':
  15. 'wohnzimmer',
  16. }
  17. # room powerswitch ids
  18. ROOM2POWER_DOMO_IDX = {
  19. 'arbeitszimmer': 2839,
  20. 'wohnzimmer': 2840,
  21. }
  22. class RoomState(object):
  23. def __init__(self):
  24. self.last_switches = {}
  25. for room in ROOM2POWER_DOMO_IDX:
  26. self.last_switches[room] = time.time()
  27. STATE = RoomState()
  28. # map alexa slot to domoticz switch value
  29. ON_OFF_SLOT = {'an': 'On', 'aus': 'Off'}
  30. DOMO_ALEXA_AUTH = ('alexa', os.environ['DOMO_ALEXA_PW'])
  31. DOMO_BASE = 'https://domo.cere.duckdns.org/json.htm'
  32. def domo_command(**kwargs):
  33. t = default_timer()
  34. try:
  35. kwargs['type'] = 'command'
  36. resp = requests.get(DOMO_BASE, params=kwargs, auth=DOMO_ALEXA_AUTH)
  37. if resp.status_code == 200:
  38. return resp.json()
  39. else:
  40. raise ValueError('code: %s' % resp.status_code)
  41. finally:
  42. log.info('domo call in %.3f sec' % (default_timer()-t))
  43. @ask.intent("LightIntent")
  44. def toggle_switch(OnOff):
  45. did = context.System.device.get('deviceId')
  46. room = ALEXA_DEVICE2ROOM.get(did)
  47. if room is None:
  48. return statement('Sorry, Ich weiss nicht wo du bist')
  49. log.info('alexa: room %s switch: %s' % (room, OnOff))
  50. assert OnOff in ON_OFF_SLOT
  51. switchcmd = ON_OFF_SLOT[OnOff]
  52. domo_idx = ROOM2POWER_DOMO_IDX[room]
  53. log.info('domoticz: device %s switch: %s' % (domo_idx, switchcmd))
  54. domo_command(param='switchlight', idx=domo_idx, switchcmd=switchcmd)
  55. delta_last = time.time() - STATE.last_switches[room]
  56. STATE.last_switches[room] = time.time()
  57. if delta_last < 30:
  58. return statement('')
  59. else:
  60. if choice(range(10)) == 0:
  61. return statement('Ich habe das Licht im %s %sgeschaltet.' % (room, OnOff))
  62. else:
  63. return statement('OK')