#!/usr/bin/env python3 import requests import csv from io import StringIO from common import * def hexToCode(hex): b = bin(int(hex, 16))[2:] facility = int(b[0:8], 2) code = int(b[9:24], 2) return((facility, code)) def codeToHex(facility, code): return "{:08X}".format(int(bin(facility)[2:] + "0" + bin(code)[2:] + "1", 2)) # hexToCode("01E29DA1") <-> codeToHex(241, 20176) def sendSchedule(target_ip): # clear all people outString = StringIO() writer = csv.DictWriter(outString, fieldnames) writer.writeheader() writer.writerow({}) outString.seek(0) doCSVImport(target_ip, outString) # clear all schedules delXML = E_plain.VertXMessage( *[E.Schedules({"action": "DD", "scheduleID": str(ii)}) for ii in range(1, 8)]) doXMLRequest(target_ip, delXML) # load new schedules with open("schedules.xml", "rb") as f: doXMLRequest(target_ip, f.read()) def sendCardFormat(targetIP, formatName, templateID, facilityCode): # TODO: add delete formats # delete example: el = E_plain.VertXMessage( E.CardFormats({"action": "AD"}, E.CardFormat({"formatName": formatName, "templateID": str(templateID)} E.FixedField({"value": str(facilityCode)})))) return doXMLRequest(targetIP, el) def lockOrUnlockDoor(targetIP, lock=True): el = E_plain.VertXMessage( E.Doors({"action": "CM", "command": "lockDoor" if lock else "unlockDoor"})) return doXMLRequest(targetIP, el) def getStatus(targetIP): el = E_plain.VertXMessage( E.Doors({"action": "LR", "responseFormat": "status"})) xml = doXMLRequest(targetIP, el) relayState = xml.find('./{*}Doors/{*}Door').attrib['relayState'] return "unlocked" if relayState == "set" else "locked" def forEachDoor(fxn): for doorName, doorData in config["doors"].items(): print(doorName) fxn(doorName, doorData) #forEachDoor(lambda name, data: sendCardFormat(data["ip"], "A901146A-244", 1, 244)) #forEachDoor(lambda name, data: sendSchedule(data["ip"]))