homeassistant-config/knx_config/knx_file_creator.py

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