def __init__(self, ip_addr, mac_addr, timeout): """initialize the connection object""" import broadlink self._hub = broadlink.S1C((ip_addr, 80), mac_addr, None) self._hub.timeout = timeout self._authorized = self.authorize() if (self._authorized): _LOGGER.info("succesfully connected to s1c hub") self._initial_data = self._hub.get_sensors_status() else: _LOGGER.error( "failed to connect s1c hub, not authorized. please fix the problem and restart the system" ) self._initial_data = None
def readSettings(settingsFile, devname): try: Dev = devices.Dev[devname] if Dev['Type'] == 'RM' or Dev['Type'] == 'RM2': device = broadlink.rm((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'MP1': device = broadlink.mp1((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'SP1': device = broadlink.sp1((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'SP2': device = broadlink.sp2((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'A1': device = broadlink.a1((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'HYSEN': device = broadlink.hysen((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'S1C': device = broadlink.S1C((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) elif Dev['Type'] == 'DOOYA': device = broadlink.dooya((Dev['IPAddress'], 80), Dev['MACAddress'], Dev['Device']) else: return False Dev['BaseType'] = "broadlink" if 'Delay' in Dev: device.delay = Dev['Delay'] else: device.delay = 0.0 #- set the callbacks Dev['learnCommand'] = learnCommand Dev['sendCommand'] = sendCommand Dev['getStatus'] = None Dev['setStatus'] = None Dev['getSensor'] = getSensor return device except Exception as e: logfile( "Broadlink device support requires broadlink python module.\npip3 install broadlink", "WARN") return None
filename=logfilename) logging.handlers.RotatingFileHandler(filename=logfilename, maxBytes=10240, backupCount=5) stderrLogger = logging.StreamHandler() stderrLogger.setFormatter(logging.Formatter(logging.BASIC_FORMAT)) logging.getLogger().addHandler(stderrLogger) # disable urlib client info logging logging.getLogger('urllib3').setLevel(logging.WARNING) logging.getLogger("requests").setLevel(logging.WARNING) setlogging() devices = broadlink.S1C( host=(host_ip, 80), mac="B4:43:0D:FE:E2:1F") # Change to your S1C MAC an IP #devices = broadlink.S1C(host=(host_ip,80), mac=broadlink_mac) devices.auth() logging.info(devices) sens = devices.get_sensors_status() old = sens for i, se in enumerate(sens['sensors']): txt = 'Name:{}, status:{}, type: {}'.format(se['name'], se['status'], se['type']) post_slack(txt, slack_url)
import broadlink import time, os devices = broadlink.S1C(host=("192.168.0.62",80), mac=bytearray.fromhex("34EA34F0BAA0")) # Change to your S1C IP Address and S1C Mac Address devices.auth() sens = devices.get_sensors_status() old = sens while 1: try: sens = devices.get_sensors_status() for i, se in enumerate(sens['sensors']): if se['status'] != old['sensors'][i]['status']: sName = se['name'] sType = se['type'] if sType == "Door Sensor" and str(se['status']) == "0" or sType == "Door Sensor" and str(se['status']) == "128": # Instead of sType you can test for sName in case you have multiple sensors print time.ctime() + ": Door closed: " + str(se['status']) os.system("mosquitto_pub -h 192.168.0.41 -p 1883 -t 'sensors/s1c/entrance_door' -u emaus -P arizinho -m " + "Fechada") # change the ip address, user name and password for your mosquitto server elif sType == "Door Sensor" and str(se['status']) == "16" or sType == "Door Sensor" and str(se['status']) == "144": print time.ctime() +": Door opened: " + str(se['status']) os.system("mosquitto_pub -h 192.168.0.41 -p 1883 -t 'sensors/s1c/entrance_door' -u emaus -P arizinho -m " + "Aberta") elif sType == "Door Sensor" and str(se['status']) == "48": print time.ctime() +": Door Sensor tampered: " + str(se['status']) os.system("mosquitto_pub -h 192.168.0.41 -p 1883 -t 'sensors/s1c/entrance_door' -u emaus -P arizinho -m " + "Irregular") elif sType == "Motion Sensor" and str(se['status']) == "0" or sType == "Motion Sensor" and str(se['status']) == "128": print time.ctime() +": No Motion: " + str(se['status']) os.system("mosquitto_pub -h 192.168.0.41 -p 1883 -t 'sensors/s1c/motion_sensor' -u emaus -P arizinho -m " + "Sem_movimento") elif sType == "Motion Sensor" and str(se['status']) == "16": print time.ctime() +": Motion Detected: " + str(se['status'])
import broadlink import time, os mosquitto_address = "x.x.x.x" # change the ip address, user name and password for your mosquitto server mosquitto_port = "xxxx" mosquitto_user = "******" mosquitto_password = "******" broadlink_s1c_ip = "x.x.x.x" # Change to your S1C IP Address and S1C Mac Address broadlink_s1c_mac = "xxxxxxxxxxxx" devices = broadlink.S1C(host=(broadlink_s1c_ip,80), mac=bytearray.fromhex(broadlink_s1c_mac)) # Change to your S1C IP Address and S1C Mac Address devices.auth() sens = devices.get_sensors_status() old = sens while 1: try: sens = devices.get_sensors_status() for i, se in enumerate(sens['sensors']): if se['status'] != old['sensors'][i]['status']: sName = se['name'] sType = se['type'] if sType == "Door Sensor" and str(se['status']) == "0" or sType == "Door Sensor" and str(se['status']) == "128": # Instead of sType you can test for sName in case you have multiple sensors print time.ctime() + ": Door closed: " + str(se['status']) os.system("mosquitto_pub -h mosquitto_address -p mosquitto_port -t 'sensors/s1c/entrance_door' -u mosquitto_user -P mosquitto_password -m " + "Closed") elif sType == "Door Sensor" and str(se['status']) == "16" or sType == "Door Sensor" and str(se['status']) == "144": print time.ctime() +": Door opened: " + str(se['status']) os.system("mosquitto_pub -h mosquitto_address -p mosquitto_port -t 'sensors/s1c/entrance_door' -u mosquitto_user -P mosquitto_password -m " + "Open") elif sType == "Door Sensor" and str(se['status']) == "48":
def readSettingsFile(): global devices global DeviceByName global RestrictAccess global LearnFrom global OverwriteProtected global GlobalPassword global GlobalTimeout global settingsFile # A few defaults serverPort = 8080 Autodetect = False OverwriteProtected = True listen_address = '0.0.0.0' broadcast_address = '255.255.255.255' settingsFile = configparser.ConfigParser() settingsFile.optionxform = str settingsFile.read(settings.settingsINI) Dev = settings.Dev GlobalTimeout = settings.GlobalTimeout DiscoverTimeout = settings.DiscoverTimeout # Override them if settingsFile.has_option('General', 'password'): GlobalPassword = settingsFile.get('General', 'password').strip() if settingsFile.has_option('General', 'serverPort'): serverPort = int(settingsFile.get('General', 'serverPort')) if settingsFile.has_option('General', 'serverAddress'): listen_address = settingsFile.get('General', 'serverAddress') if listen_address.strip() == '': listen_address = '0.0.0.0' if settingsFile.has_option('General', 'restrictAccess'): RestrictAccess = settingsFile.get('General', 'restrictAccess').strip() if settingsFile.has_option('General', 'learnFrom'): LearnFrom = settingsFile.get('General', 'learnFrom').strip() if settingsFile.has_option('General', 'allowOverwrite'): OverwriteProtected = False if settingsFile.has_option('General', 'broadcastAddress'): broadcast = settingsFile.get('General', 'broadcastAddress') if broadcast_address.strip() == '': broadcast_address = '255.255.255.255' if settingsFile.has_option('General', 'Autodetect'): try: DiscoverTimeout = int( settingsFile.get('General', 'Autodetect').strip()) except: DiscoverTimeout = 5 Autodetect = True settingsFile.remove_option('General', 'Autodetect') # Device list DeviceByName = {} if not settings.DevList: Autodetect = True if Autodetect == True: print("Beginning device auto-detection ... ") # Try to support multi-homed broadcast better try: devices = broadlink.discover(DiscoverTimeout, listen_address, broadcast_address) except: devices = broadlink.discover(DiscoverTimeout, listen_address) backupSettings() try: broadlinkControlIniFile = open( path.join(settings.applicationDir, 'settings.ini'), 'w') for device in devices: try: device.hostname = socket.gethostbyaddr(device.host[0])[0] if "." in device.hostname: device.hostname = device.hostname.split('.')[0] except: device.hostname = "Broadlink" + device.type.upper() if device.hostname in DeviceByName: device.hostname = "%s-%s" % ( device.hostname, str(device.host).split('.')[3]) DeviceByName[device.hostname] = device if not settingsFile.has_section(device.hostname): settingsFile.add_section(device.hostname) settingsFile.set(device.hostname, 'IPAddress', str(device.host[0])) hexmac = ':'.join(["%02x" % (x) for x in reversed(device.mac)]) settingsFile.set(device.hostname, 'MACAddress', hexmac) settingsFile.set(device.hostname, 'Device', hex(device.devtype)) settingsFile.set(device.hostname, 'Timeout', str(device.timeout)) settingsFile.set(device.hostname, 'Type', device.type.upper()) device.auth() print("%s: Found %s on %s (%s) type: %s" % (device.hostname, device.type, device.host, hexmac, hex(device.devtype))) settingsFile.write(broadlinkControlIniFile) broadlinkControlIniFile.close() except StandardError as e: print("Error writing settings file: %s" % e) restoreSettings() else: devices = [] if settings.DevList: for devname in settings.DevList: if Dev[devname, 'Type'] == 'RM' or Dev[devname, 'Type'] == 'RM2': device = broadlink.rm((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'MP1': device = broadlink.mp1((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'SP1': device = broadlink.sp1((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'SP2': device = broadlink.sp2((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'A1': device = broadlink.a1((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'HYSEN': device = broadlink.hysen((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'S1C': device = broadlink.S1C((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) if Dev[devname, 'Type'] == 'DOOYA': device = broadlink.dooya((Dev[devname, 'IPAddress'], 80), Dev[devname, 'MACAddress'], Dev[devname, 'Device']) device.timeout = Dev[devname, 'Timeout'] if not devname in DeviceByName: device.hostname = devname device.auth() devices.append(device) print("%s: Read %s on %s (%s)" % (devname, device.type, str(device.host[0]), device.mac)) DeviceByName[devname] = device return { "port": serverPort, "listen": listen_address, "timeout": GlobalTimeout }