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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
                        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)
Exemplo n.º 4
0
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'])
Exemplo n.º 5
0
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":
Exemplo n.º 6
0
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
    }