Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- from requests import get
- import requests as req
- import json
- HOST = ""
- PORT = 4999 # Listening Port
- # Retrieve input from RTI
- # RTI 2-Way driver comand srting syntax examples:
- # ,PASSWORD*SERVER:PORT/api/services/media_player/select_source*entity_id*media_player.living_room_tv*source*Netflix^
- # ,PASSWORD*SERVER:PORT/api/services/vacuum/turn_on*entity_id*vacuum.roomba**^
- # ,PASSWORD*SERVER:PORT/api/states/vacuum.roomba****^
- # ,PASSWORD*SERVER:PORT/api/states****^
- def msg_to_hass(strCommand):
- password = strCommand.split("*")[0] # HA PASSWORD
- server = strCommand.split("*")[1] # HA SERVER ADDRESS
- field = strCommand.split("*")[2] # HA Field1
- device = strCommand.split("*")[3] # HA Field1 Value
- field2 = strCommand.split("*")[4] # HA Field2
- device2 = strCommand.split("*")[5] # HA Field2 Value
- data = {} # initialize dictionary
- data[field] = device # insert field 1 and value into dictionary
- data[field2] = device2 # insert field 2 and value into dictionary
- new_data={k:data[k] for k in data if data[k]} # Remove blank entries from data dictionary and save as new_data
- r = new_data
- r = json.dumps(r)
- type(r)
- headers = {'x-ha-access': password, 'content-type': 'application/json'}
- url = server
- data = r
- print(url, data)
- response = req.post(url, headers=headers, data=data)
- global state
- global state2
- response2 = get(url, headers=headers)
- state = response.text
- state2 = response2.text
- def create_listen_socket(host, port):
- """ Setup the sockets our server will receive connection
- requests on """
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- sock.bind((host, port))
- sock.listen(100)
- return sock
- ##def recv_state(sock):
- ## """ Wait for data to arrive on the socket, then parse into
- ## messages using '*' as message delimiter """
- def recv_msg(sock):
- """ Wait for data to arrive on the socket, then parse into
- messages using b'\0' as message delimiter """
- data = bytearray()
- msg = ''
- # Repeatedly read 4096 bytes off the socket, storing the bytes
- # in data until we see a delimiter
- while not msg:
- recvd = sock.recv(4096)
- if not recvd:
- # Socket has been closed prematurely
- raise ConnectionError()
- data = data + recvd
- if b'^' in recvd: # ^ is the last character in the message. Strip the starting comma.
- msg = data
- msg = msg.decode('utf-8')
- msg = msg.split(",")[-1]
- return msg.rstrip("^")
- def prep_msg(msg):
- """ Prepare a string to be sent as a message """
- msg += '\0'
- return msg.encode('utf-8')
- def send_msg(sock, msg):
- """ Send a string over a socket, preparing it first """
- data = prep_msg(msg)
- sock.sendall(data)
- def handle_client(sock, addr):
- """ Receive data from the client via sock and echo it back """
- try:
- msg = recv_msg(sock) # Blocks until received complete message
- print('{}: {}'.format(addr, msg))
- msg_to_hass(msg)
- msg = state
- prep_msg(msg)
- print(msg) # Print state of HA Device
- send_msg(sock, msg)
- msg = state2
- prep_msg(msg)
- print(msg) # Print state of HA Device
- send_msg(sock, msg)
- except (ConnectionError, BrokenPipeError):
- print('Socket error')
- finally:
- handle_client(client_sock, addr) # loop back to recv_msg
- #print('Closed connection to {}'.format(addr))
- # sock.close()
- if __name__ == '__main__':
- listen_sock = create_listen_socket(HOST, PORT)
- addr = listen_sock.getsockname()
- print('Listening on {}'.format(addr))
- while True:
- client_sock, addr = listen_sock.accept()
- print('Connection from {}'.format(addr))
- handle_client(client_sock, addr)
Add Comment
Please, Sign In to add comment