Skip to content

Commit

Permalink
Integrating fransiouz switch class and cleanup code, updated code for…
Browse files Browse the repository at this point in the history
… websockets 9
  • Loading branch information
mrwiwi authored May 3, 2021
1 parent c9cc6bf commit d752676
Show file tree
Hide file tree
Showing 6 changed files with 213 additions and 34 deletions.
16 changes: 10 additions & 6 deletions alarm_control_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@

class Alarm:

def __init__(self, current_state, tydom_attributes=None, mqtt=None):
def __init__(self, current_state, alarm_pin=None, tydom_attributes=None, mqtt=None):
self.attributes = tydom_attributes
self.device_id = self.attributes['device_id']
self.endpoint_id = self.attributes['endpoint_id']
self.id = self.attributes['id']
self.name = self.attributes['name']
self.current_state = current_state
self.mqtt = mqtt
self.alarm_pin = alarm_pin

async def setup(self):
self.device = {}
Expand All @@ -36,7 +37,13 @@ async def setup(self):
# self.config['attributes'] = self.attributes
self.config['command_topic'] = alarm_command_topic.format(id=self.id)
self.config['state_topic'] = alarm_state_topic.format(id=self.id)
self.config['code_arm_required'] = 'false'
self.config['code'] = self.alarm_pin
if (self.alarm_pin != None):
self.config['code_arm_required'] = 'true'
else:
self.config['code_arm_required'] = 'false'


self.config['json_attributes_topic'] = alarm_attributes_topic.format(id=self.id)

if (self.mqtt != None):
Expand All @@ -52,7 +59,7 @@ async def update(self):
print("Alarm sensors Error :")
print(e)


self.state_topic = alarm_state_topic.format(id=self.id, state=self.current_state)
if (self.mqtt != None):
self.mqtt.mqtt_client.publish(self.state_topic, self.current_state, qos=0, retain=True) #Alarm State
Expand Down Expand Up @@ -94,6 +101,3 @@ async def put_alarm_state(tydom_client, device_id, alarm_id, home_zone, night_zo
zone_id = None

await tydom_client.put_alarm_cdata(device_id=device_id, alarm_id=alarm_id, value=value, zone_id=zone_id)



58 changes: 45 additions & 13 deletions mqtt_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
####################################### MQTT
from light import Light
from boiler import Boiler
from switch import Switch

tydom_topic = "+/tydom/#"
refresh_topic = "homeassistant/requests/tydom/refresh"
Expand Down Expand Up @@ -69,11 +70,11 @@ def on_connect(self, client, flags, rc, properties):
print("##################################")
try:
print("Subscribing to : ", tydom_topic)
client.subscribe('homeassistant/status', qos=0)
# client.subscribe('homeassistant/#', qos=0)
client.subscribe(tydom_topic, qos=0)
except Exception as e:
print("Error on connect : ", e)


async def on_message(self, client, topic, payload, qos, properties):
# print('Incoming MQTT message : ', topic, payload)
Expand All @@ -92,8 +93,7 @@ async def on_message(self, client, topic, payload, qos, properties):
elif (topic == "homeassistant/requests/tydom/scenarii"):
print('Incoming MQTT scenarii request : ', topic, payload)
await self.tydom.get_scenarii()
elif (topic == "homeassistant/status" and payload.decode() == 'online'):
await self.tydom.get_devices_data()

elif (topic == "/tydom/init"):
print('Incoming MQTT init request : ', topic, payload)
await self.tydom.connect()
Expand All @@ -109,7 +109,7 @@ async def on_message(self, client, topic, payload, qos, properties):

# else:
# await self.tydom.put_devices_data(str(get_id), 'position', str(json.loads(payload)))

elif 'set_positionCmd' in str(topic):
print('Incoming MQTT set_positionCmd request : ', topic, payload)
value = str(payload).strip('b').strip("'")
Expand All @@ -123,18 +123,18 @@ async def on_message(self, client, topic, payload, qos, properties):


elif ('set_position' in str(topic)) and not ('set_positionCmd'in str(topic)):

print('Incoming MQTT set_position request : ', topic, json.loads(payload))
value = json.loads(payload)
# print(value)
get_id = (topic.split("/"))[2] #extract ids from mqtt
device_id = (get_id.split("_"))[0] #extract id from mqtt
endpoint_id = (get_id.split("_"))[1] #extract id from mqtt

await Cover.put_position(tydom_client=self.tydom, device_id=device_id, cover_id=endpoint_id, position=str(value))

elif 'set_levelCmd' in str(topic):
print('Incoming MQTT set_positionCmd request : ', topic, payload)
print('Incoming MQTT set_levelCmd request : ', topic, payload)
value = str(payload).strip('b').strip("'")

get_id = (topic.split("/"))[2] # extract ids from mqtt
Expand All @@ -148,7 +148,7 @@ async def on_message(self, client, topic, payload, qos, properties):

elif ('set_level' in str(topic)) and not ('set_levelCmd' in str(topic)):

print('Incoming MQTT set_position request : ', topic, json.loads(payload))
print('Incoming MQTT set_level request : ', topic, json.loads(payload))
value = json.loads(payload)
# print(value)
get_id = (topic.split("/"))[2] # extract ids from mqtt
Expand All @@ -167,7 +167,7 @@ async def on_message(self, client, topic, payload, qos, properties):
endpoint_id = (get_id.split("_"))[1] #extract id from mqtt

await Alarm.put_alarm_state(tydom_client=self.tydom, device_id=device_id, alarm_id=endpoint_id, asked_state=command, home_zone=self.home_zone, night_zone=self.night_zone)

elif ('set_setpoint' in str(topic)):

value = str(payload).strip('b').strip("'")
Expand Down Expand Up @@ -204,6 +204,40 @@ async def on_message(self, client, topic, payload, qos, properties):

await Boiler.put_thermicLevel(tydom_client=self.tydom, device_id=device_id, boiler_id=endpoint_id,
set_thermicLevel=str(value))
elif ('set_switch_state' in str(topic)) and not ('homeassistant'in str(topic)):
# print(topic, payload, qos, properties)
command = str(payload).strip('b').strip("'")

get_id = (topic.split("/"))[2] #extract ids from mqtt
device_id = (get_id.split("_"))[0] #extract id from mqtt
endpoint_id = (get_id.split("_"))[1] #extract id from mqtt

await Switch.put_switch_state(tydom_client=self.tydom, device_id=device_id, switch_id=endpoint_id, state=command)

elif 'set_levelCmdGate' in str(topic):
print('Incoming MQTT set_levelCmdGate request : ', topic, payload)
value = str(payload).strip('b').strip("'")

get_id = (topic.split("/"))[2] # extract ids from mqtt
device_id = (get_id.split("_"))[0] # extract id from mqtt
endpoint_id = (get_id.split("_"))[1] # extract id from mqtt

print(str(get_id), 'levelCmd', value)
await Light.put_levelCmdGate(tydom_client=self.tydom, device_id=device_id, switch_id=endpoint_id,
levelCmd=str(value))


elif ('set_levelGate' in str(topic)) and not ('set_levelCmd' in str(topic)):

print('Incoming MQTT set_levelGate request : ', topic, json.loads(payload))
value = json.loads(payload)
# print(value)
get_id = (topic.split("/"))[2] # extract ids from mqtt
device_id = (get_id.split("_"))[0] # extract id from mqtt
endpoint_id = (get_id.split("_"))[1] # extract id from mqtt

await Light.put_levelGate(tydom_client=self.tydom, device_id=device_id, switch_id=endpoint_id,
level=str(value))

else:
pass
Expand All @@ -214,7 +248,7 @@ def on_disconnect(self, client, packet, exc=None):
print('MQTT Disconnected !')
print("##################################")
# self.connect()


def on_subscribe(self, client, mid, qos):
print("MQTT is connected and suscribed ! =)", client)
Expand All @@ -223,5 +257,3 @@ def on_subscribe(self, client, mid, qos):
client.publish('homeassistant/sensor/tydom/last_clean_startup', pyld, qos=1, retain=True)
except Exception as e:
print("on subscribe error : ", e)


2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
websockets>=8.1
websockets>=9.0.1
requests>=2.22.0
gmqtt>=0.6.1
114 changes: 114 additions & 0 deletions switch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import json
import time
from datetime import datetime
from sensors import sensor

switch_config_topic = "homeassistant/switch/tydom/{id}/config"
switch_state_topic = "switch/tydom/{id}/state"
switch_attributes_topic = "switch/tydom/{id}/attributes"
switch_command_topic = "switch/tydom/{id}/set_levelCmdGate"
switch_level_topic = "switch/tydom/{id}/current_level"
switch_set_level_topic = "switch/tydom/{id}/set_levelGate"





class Switch:
def __init__(self, tydom_attributes, set_level=None, mqtt=None):
self.attributes = tydom_attributes
self.device_id = self.attributes['device_id']
self.endpoint_id = self.attributes['endpoint_id']
self.id = self.attributes['id']
self.name = self.attributes['switch_name']

try:
self.current_level = self.attributes['level']
except Exception as e:
print(e)
self.current_level = None
self.set_level = set_level

#try:
# self.current_state = self.attributes['state']
#except Exception as e:
# print(e)
# self.current_state = 'On'
self.mqtt = mqtt


async def setup(self):
#availability:
# - topic: "home/bedroom/switch1/available"

self.device = {}
self.device['manufacturer'] = 'Delta Dore'
self.device['model'] = 'Porte'
self.device['name'] = self.name
self.device['identifiers'] = self.id

self.config_topic = switch_config_topic.format(id=self.id)
self.config = {}
self.config['name'] = self.name
self.config['unique_id'] = self.id
# self.config['attributes'] = self.attributes
self.config['command_topic'] = switch_command_topic.format(id=self.id)
self.config['state_topic'] = switch_state_topic.format(id=self.id)
self.config['json_attributes_topic'] = switch_attributes_topic.format(id=self.id)

self.config['payload_on'] = "TOGGLE"
self.config['payload_off'] = "TOGGLE"
#self.config['optimistic'] = 'false'
self.config['retain'] = 'false'
self.config['device'] = self.device
# print(self.config)

if (self.mqtt != None):
self.mqtt.mqtt_client.publish(self.config_topic, json.dumps(self.config), qos=0)
# setup_pub = '(self.config_topic, json.dumps(self.config), qos=0)'
# return(setup_pub)

async def update(self):
await self.setup()

try:
await self.update_sensors()
except Exception as e:
print("Switch sensors Error :")
print(e)


self.level_topic = switch_state_topic.format(id=self.id, current_level=self.current_level)

if (self.mqtt != None):
self.mqtt.mqtt_client.publish(self.level_topic, self.current_level, qos=0, retain=True) #Switch State
self.mqtt.mqtt_client.publish(self.config['json_attributes_topic'], self.attributes, qos=0)
print("Switch created / updated : ", self.name, self.id, self.current_level)


# update_pub = '(self.position_topic, self.current_position, qos=0, retain=True)'
# return(update_pub)


async def update_sensors(self):
# print('test sensors !')
for i, j in self.attributes.items():
# sensor_name = "tydom_alarm_sensor_"+i
# print("name "+sensor_name, "elem_name "+i, "attributes_topic_from_device ",self.config['json_attributes_topic'], "mqtt",self.mqtt)
if not i == 'device_type' or not i == 'id':
new_sensor = None
new_sensor = sensor(elem_name=i, tydom_attributes_payload=self.attributes, attributes_topic_from_device=self.config['json_attributes_topic'], mqtt=self.mqtt)
await new_sensor.update()
# def __init__(self, name, elem_name, tydom_attributes_payload, attributes_topic_from_device, mqtt=None):



async def put_levelGate(tydom_client, device_id, switch_id, level):
print(switch_id, 'level', level)
if not (level == ''):
await tydom_client.put_devices_data(device_id, switch_id, 'level', level)

async def put_levelCmdGate(tydom_client, device_id, switch_id, levelCmd):
print(switch_id, 'levelCmd', levelCmd)
if not (levelCmd == ''):
await tydom_client.put_devices_data(device_id, switch_id, 'levelCmd', levelCmd)
25 changes: 13 additions & 12 deletions tydomConnector.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,12 @@ def __init__(self, mac, password, alarm_pin=None, host='mediation.tydom.com'):
if self.host == "mediation.tydom.com":
print('Setting remote mode context.')
self.remote_mode = True
self.ssl_context = None
#self.ssl_context = None
self.ssl_context = ssl._create_unverified_context()
self.cmd_prefix = "\x02"
self.ping_timeout = 40


else:
print('Setting local mode context.')
self.remote_mode = False
Expand All @@ -77,8 +78,8 @@ async def connect(self):
print('""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""')
print('TYDOM WEBSOCKET CONNECTION INITIALISING.... ')



print('Building headers, getting 1st handshake and authentication....')

httpHeaders = {"Connection": "Upgrade",
Expand Down Expand Up @@ -108,22 +109,22 @@ async def connect(self):
websocket_ssl_context = self.ssl_context
else:
websocket_ssl_context = True # Verify certificate

# outer loop restarted every time the connection fails
print('Attempting websocket connection with tydom hub.......................')
print('Host Target :')
print(self.host)
print(self.host)
'''
Connecting to webSocket server
websockets.client.connect returns a WebSocketClientProtocol, which is used to send and receive messages
'''
self.connection = await websockets.client.connect('wss://{}:443/mediation/client?mac={}&appli=1'.format(self.host, self.mac),
self.connection = await websockets.connect('wss://{}:443/mediation/client?mac={}&appli=1'.format(self.host, self.mac),
extra_headers=websocketHeaders, ssl=websocket_ssl_context, ping_timeout=None)

return self.connection

############ Utils

# Generate 16 bytes random key for Sec-WebSocket-Keyand convert it to base64
def generate_random_key(self):
return base64.b64encode(os.urandom(16))
Expand Down Expand Up @@ -215,7 +216,7 @@ async def put_alarm_cdata(self, device_id, alarm_id=None, value=None, zone_id=No

# str_request = self.cmd_prefix + "PUT /devices/{}/endpoints/{}/cdata?name={},".format(str(alarm_id),str(alarm_id),str(cmd)) + body +");"
str_request = self.cmd_prefix + "PUT /devices/{}/endpoints/{}/cdata?name={} HTTP/1.1\r\nContent-Length: ".format(str(device_id),str(alarm_id),str(Cmd))+str(len(body))+"\r\nContent-Type: application/json; charset=UTF-8\r\nTransac-Id: 0\r\n\r\n"+body+"\r\n\r\n"

a_bytes = bytes(str_request, "ascii")
# print(a_bytes)
print('Sending to tydom client.....', 'PUT cdata', body)
Expand All @@ -227,7 +228,7 @@ async def put_alarm_cdata(self, device_id, alarm_id=None, value=None, zone_id=No
print(e)
print(a_bytes)


# Get some information on Tydom
async def get_info(self):
msg_type = '/info'
Expand Down Expand Up @@ -312,4 +313,4 @@ async def setup(self):
# print('Starting Heartbeating...')
# while 1:
# await self.post_refresh()
# await asyncio.sleep(40)
# await asyncio.sleep(40)
Loading

0 comments on commit d752676

Please sign in to comment.