haddad1

RTI_HA_2WAY

Dec 6th, 2018
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.93 KB | None | 0 0
  1. import socket
  2. from requests import get
  3. import requests as req
  4. import json
  5. HOST = ""
  6. PORT = 4999 # Listening Port
  7. # Retrieve input from RTI
  8. # RTI 2-Way driver comand srting syntax examples:
  9. #   ,PASSWORD*SERVER:PORT/api/services/media_player/select_source*entity_id*media_player.living_room_tv*source*Netflix^
  10. #   ,PASSWORD*SERVER:PORT/api/services/vacuum/turn_on*entity_id*vacuum.roomba**^
  11. #   ,PASSWORD*SERVER:PORT/api/states/vacuum.roomba****^
  12. #   ,PASSWORD*SERVER:PORT/api/states****^
  13. def msg_to_hass(strCommand):
  14.     password = strCommand.split("*")[0] # HA PASSWORD
  15.     server = strCommand.split("*")[1] # HA SERVER ADDRESS
  16.     field = strCommand.split("*")[2] # HA Field1
  17.     device = strCommand.split("*")[3] # HA Field1 Value
  18.     field2 = strCommand.split("*")[4] # HA Field2
  19.     device2 = strCommand.split("*")[5] # HA Field2 Value
  20.     data = {}   # initialize dictionary
  21.     data[field] = device # insert field 1 and value into dictionary
  22.     data[field2] = device2 # insert field 2 and value into dictionary
  23.     new_data={k:data[k] for k in data if data[k]} # Remove blank entries from data dictionary and save as new_data
  24.     r = new_data
  25.     r = json.dumps(r)
  26.     type(r)
  27.     headers = {'x-ha-access': password, 'content-type': 'application/json'}
  28.     url = server
  29.     data = r
  30.     print(url, data)
  31.     response = req.post(url, headers=headers, data=data)
  32.     global state
  33.     global state2
  34.     response2 = get(url, headers=headers)
  35.     state = response.text
  36.     state2 = response2.text
  37.    
  38. def create_listen_socket(host, port):
  39.     """ Setup the sockets our server will receive connection
  40.    requests on """
  41.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  42.     sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  43.     sock.bind((host, port))
  44.     sock.listen(100)
  45.     return sock
  46.  
  47. ##def recv_state(sock):
  48. ##    """ Wait for data to arrive on the socket, then parse into
  49. ##    messages using '*' as message delimiter """
  50. def recv_msg(sock):
  51.     """ Wait for data to arrive on the socket, then parse into
  52.    messages using b'\0' as message delimiter """
  53.     data = bytearray()
  54.     msg = ''
  55.     # Repeatedly read 4096 bytes off the socket, storing the bytes
  56.     # in data until we see a delimiter
  57.     while not msg:
  58.         recvd = sock.recv(4096)
  59.         if not recvd:
  60.             # Socket has been closed prematurely
  61.             raise ConnectionError()
  62.         data = data + recvd
  63.         if b'^' in recvd:   # ^ is the last character in the message. Strip the starting comma.
  64.             msg = data
  65.     msg = msg.decode('utf-8')
  66.     msg = msg.split(",")[-1]
  67.     return msg.rstrip("^")
  68.  
  69. def prep_msg(msg):
  70.     """ Prepare a string to be sent as a message """
  71.     msg += '\0'
  72.     return msg.encode('utf-8')
  73.  
  74. def send_msg(sock, msg):
  75.     """ Send a string over a socket, preparing it first """
  76.     data = prep_msg(msg)
  77.     sock.sendall(data)
  78.  
  79. def handle_client(sock, addr):
  80.     """ Receive data from the client via sock and echo it back """
  81.     try:
  82.         msg = recv_msg(sock) # Blocks until received complete message
  83.         print('{}: {}'.format(addr, msg))
  84.         msg_to_hass(msg)
  85.         msg = state
  86.         prep_msg(msg)
  87.         print(msg) # Print state of HA Device
  88.         send_msg(sock, msg)
  89.         msg = state2
  90.         prep_msg(msg)
  91.         print(msg) # Print state of HA Device
  92.         send_msg(sock, msg)
  93.  
  94.     except (ConnectionError, BrokenPipeError):
  95.         print('Socket error')
  96.     finally:
  97.         handle_client(client_sock, addr)        # loop back to recv_msg
  98.         #print('Closed connection to {}'.format(addr))
  99.     #     sock.close()
  100.  
  101.  
  102. if __name__ == '__main__':
  103.     listen_sock = create_listen_socket(HOST, PORT)
  104.     addr = listen_sock.getsockname()
  105.     print('Listening on {}'.format(addr))
  106.  
  107.     while True:
  108.         client_sock, addr = listen_sock.accept()
  109.         print('Connection from {}'.format(addr))
  110.         handle_client(client_sock, addr)
Add Comment
Please, Sign In to add comment