159 lines
6.0 KiB
Python
159 lines
6.0 KiB
Python
|
from collections import namedtuple
|
||
|
from typing import List
|
||
|
from ruamel.yaml import YAML
|
||
|
|
||
|
DeviceInfo = namedtuple("DeviceInfo", ['csv_name', 'display_name'])
|
||
|
yaml = YAML()
|
||
|
|
||
|
|
||
|
def first_lower(s):
|
||
|
if len(s) == 0:
|
||
|
return s
|
||
|
else:
|
||
|
return s[0].lower() + s[1:]
|
||
|
|
||
|
|
||
|
def import_ets5_csv_file(csv_file):
|
||
|
result = dict()
|
||
|
with open(csv_file, encoding='utf-8') as f:
|
||
|
for line in f:
|
||
|
splitted_line = line.split(",")
|
||
|
name = splitted_line[0].replace('"', "")
|
||
|
group_address = splitted_line[1].replace('"', "")
|
||
|
if '-' not in group_address:
|
||
|
result[name.strip()] = splitted_line[1].replace('"', "").strip()
|
||
|
return result
|
||
|
|
||
|
|
||
|
def create_dimmable_lights(device_info : List[DeviceInfo],
|
||
|
csv_contents,
|
||
|
postfix_on_off_write=" Schalten",
|
||
|
postfix_on_off_read=" RM Schalten",
|
||
|
postfix_dim=" Dimmen",
|
||
|
postfix_brightness_write=" Helligkeit",
|
||
|
postfix_brightness_read=" RM Helligkeit"):
|
||
|
|
||
|
result = []
|
||
|
for entry in device_info:
|
||
|
try:
|
||
|
display_name = entry.display_name
|
||
|
on_off_write_addr = csv_contents[entry.csv_name + postfix_on_off_write]
|
||
|
on_off_read_addr = csv_contents[entry.csv_name + postfix_on_off_read]
|
||
|
dimm_addr = csv_contents[entry.csv_name + postfix_dim]
|
||
|
brightness_write_addr = csv_contents[entry.csv_name + postfix_brightness_write]
|
||
|
brightness_read_addr = csv_contents[entry.csv_name + postfix_brightness_read]
|
||
|
|
||
|
result.append({
|
||
|
'platform': 'knx',
|
||
|
'address': on_off_write_addr,
|
||
|
'state_address': on_off_read_addr,
|
||
|
'name': display_name,
|
||
|
'brightness_address': brightness_write_addr,
|
||
|
'brightness_state_address': brightness_read_addr,
|
||
|
})
|
||
|
except KeyError as e:
|
||
|
raise ValueError("Skipping %s - Could not find CSV File entry: %s" % (entry.csv_name, str(e)))
|
||
|
|
||
|
return result
|
||
|
|
||
|
|
||
|
def write_yaml(device_dict):
|
||
|
pass
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
knx_dimmable_lights = [
|
||
|
DeviceInfo('Wohnzimmerlampe', 'Wohnzimmer Deckenlampe'),
|
||
|
DeviceInfo('EsszimmerlampeWest', 'Esszimmer Deckenlampe West'),
|
||
|
DeviceInfo('EsszimmerlampeMitte', 'Esszimmer Deckenlampe Mitte'),
|
||
|
DeviceInfo("EsszimmerWandlampe", 'Esszimmer Schrankleuchte'),
|
||
|
DeviceInfo("Küchenlampe", "Küche Deckenlampe"),
|
||
|
DeviceInfo("AussenleuchteUntenSO", "Aussen Terassenlicht"),
|
||
|
DeviceInfo("Gang", "Gang Licht"),
|
||
|
DeviceInfo("Bad", "Bad Licht"),
|
||
|
DeviceInfo("GangWindfang", "Gang Einganglicht"),
|
||
|
DeviceInfo("LichtWaschküche", "Waschküche Licht"),
|
||
|
]
|
||
|
imported_csv = import_ets5_csv_file('export_project1.csv')
|
||
|
imported_csv.update(import_ets5_csv_file('export_project2.csv'))
|
||
|
|
||
|
devices = {
|
||
|
'light': create_dimmable_lights(knx_dimmable_lights, imported_csv),
|
||
|
}
|
||
|
yaml.dump(devices, open('knx_devices.yaml', 'w'))
|
||
|
|
||
|
|
||
|
def createLights(csvContents, idToRoomMap, knxSendClient, knxRecvClient,
|
||
|
postfixWrite=" Schalten", postfixRead=" RM Schalten"):
|
||
|
from pysmarthome.backends.knx.devices import Light
|
||
|
result = []
|
||
|
|
||
|
for csvName, info in idToRoomMap.items():
|
||
|
try:
|
||
|
room = info['room']
|
||
|
displayName = info['displayName']
|
||
|
deviceId = info['id']
|
||
|
onOffWriteAddr = csvContents[csvName + postfixWrite]
|
||
|
onOffReadAddr = csvContents[csvName + postfixRead]
|
||
|
l = Light(deviceId, displayName, room, onOffWriteAddr, onOffReadAddr, knxSendClient, knxRecvClient, )
|
||
|
result.append(l)
|
||
|
except KeyError as e:
|
||
|
raise ValueError("Skipping %s - Could not find CSV File entry: %s" % (csvName, str(e)))
|
||
|
|
||
|
return result
|
||
|
|
||
|
|
||
|
def createBells(csvContents, idToRoomMap, knxSendClient, knxRecvClient,
|
||
|
postfixWrite=" Schalten", postfixRead=" RM Schalten"):
|
||
|
from pysmarthome.backends.knx.devices import Bell
|
||
|
result = []
|
||
|
|
||
|
for csvName, info in idToRoomMap.items():
|
||
|
try:
|
||
|
room = info['room']
|
||
|
displayName = info['displayName']
|
||
|
deviceId = info['id']
|
||
|
onOffWriteAddr = csvContents[csvName + postfixWrite]
|
||
|
if csvName + postfixRead in csvContents:
|
||
|
onOffReadAddr = csvContents[csvName + postfixRead]
|
||
|
else:
|
||
|
onOffReadAddr = None
|
||
|
|
||
|
l = Bell(deviceId, displayName, room, onOffWriteAddr, onOffReadAddr, knxSendClient, knxRecvClient, )
|
||
|
result.append(l)
|
||
|
except KeyError as e:
|
||
|
raise ValueError("Skipping %s - Could not find CSV File entry: %s" % (csvName, str(e)))
|
||
|
|
||
|
return result
|
||
|
|
||
|
|
||
|
def createShutters(csvContents, idToRoomMap, knxSendClient, knxRecvClient,
|
||
|
postfixLongAddr=" Lang", postfixShortAddr=" Kurz", postfixReadPosition=" RM Position",
|
||
|
postfixSetPosition=" Position"):
|
||
|
from pysmarthome.backends.knx.devices import Shutter
|
||
|
result = []
|
||
|
|
||
|
for csvName, contents in idToRoomMap.items():
|
||
|
try:
|
||
|
longAddr = csvContents[csvName + postfixLongAddr]
|
||
|
shortAddr = csvContents[csvName + postfixShortAddr]
|
||
|
readPosAddr = csvContents[csvName + postfixReadPosition]
|
||
|
setPosAddr = csvContents[csvName + postfixSetPosition]
|
||
|
if type(contents) is dict:
|
||
|
displayName = contents['displayName']
|
||
|
room = contents['room']
|
||
|
deviceId = contents['id']
|
||
|
else:
|
||
|
displayName = csvName
|
||
|
room = contents
|
||
|
deviceId = first_lower(csvName)
|
||
|
|
||
|
s = Shutter(deviceId, displayName, room, shortAddr, longAddr, setPosAddr, readPosAddr,
|
||
|
knxSendClient, knxRecvClient)
|
||
|
result.append(s)
|
||
|
|
||
|
except KeyError as e:
|
||
|
raise ValueError("Skipping %s - Could not find CSV File entry: %s" % (csvName, str(e)))
|
||
|
|
||
|
return result
|