Пример #1
0
 def get(self, port=None, cfg=None, timeout=0):
     work_oids = {'t': 16, 'h': 17}
     wo = work_oids.get(port)
     if wo is None: return None
     snmp_oid = 'iso.3.6.1.4.1.3854.1.2.2.1.%u.1.3.%u' % (
         wo, self.sensor_port - 1)
     _timeout = timeout / self.snmp_tries
     if netsnmp:
         try:
             sess = netsnmp.Session(Version=1,
                                    DestHost=self.snmp_host,
                                    RemotePort=self.snmp_port,
                                    Community=self.community,
                                    Timeout=int(_timeout * 1000000),
                                    Retries=self.snmp_tries - 1)
             return sess.get(netsnmp.VarList(snmp_oid))[0].decode()
         except:
             log_traceback()
             return None
     else:
         return snmp.get(snmp_oid,
                         self.snmp_host,
                         self.snmp_port,
                         self.community,
                         _timeout,
                         self.snmp_tries - 1,
                         rf=int,
                         snmp_ver=1)
Пример #2
0
 def get(self, port=None, cfg=None, timeout=0):
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.settimeout(timeout)
     try:
         time_start = time()
         s.connect((self.host, 55443))
         if time_start + timeout < time():
             raise Exception('operation timeout')
         s.send(('{ "id": 1, "method": "get_prop", "params":' +
                 ' ["power", "color_mode", "rgb", "ct", "bright"] }\r\n'
                 ).encode())
         result = json.loads(s.recv(1024).decode())['result']
         status = 1 if result[0] == 'on' else 0
         if int(result[1]) == 2:
             red = round(int(result[4]) * 255 / 100)
             blue = round((int(result[3]) - 1700) / 4800 * red)
             value = red * 65792 + blue
         else:
             value = int(result[2])
         return status, '#{:06x}'.format(value)
     except:
         log_traceback()
         return None
     finally:
         try:
             s.close()
         except:
             pass
Пример #3
0
 def test(self, cmd=None):
     if cmd == 'self':
         mb = modbus.get_port(self.modbus_port)
         if not mb: return 'FAILED'
         mb.release()
         return 'OK'
     if cmd == 'info':
         mb = modbus.get_port(self.modbus_port)
         if not mb: return 'FAILED'
         if mb.client_type in ['tcp', 'udp']:
             reg = 22
         else:
             reg = 21
         rr = mb.read_holding_registers(reg, 1, unit=self.addr)
         mb.release()
         if rr.isError(): return 'FAILED'
         try:
             return '{:.2f}'.format(float(rr.registers[0]) / 100.0)
         except:
             log_traceback()
             return 'FAILED'
     if cmd == 'get': return self.get(timeout=get_timeout() * 10)
     return {
         'info': 'returns relay firmware version',
         'get': 'get current relay state'
     }
Пример #4
0
 def exec(self, cmd=None, args=None):
     if cmd == 'id':
         try:
             new_id = int(args)
             if new_id < 1 or new_id > 247:
                 raise Exception('id not in range 1..247')
             mb = modbus.get_port(self.modbus_port)
             if not mb:
                 raise Exception('unable to get modbus port {}'.format(
                     self.modbus_port))
             try:
                 result = mb.write_register(18, new_id, unit=self.addr)
             except:
                 log_traceback()
                 result = None
             mb.release()
             if not result or result.isError(): return 'FAILED'
             self.addr = new_id
             self.phi_cfg['addr'] = new_id
             return 'OK'
         except:
             log_traceback()
             return 'FAILED'
     else:
         return {
             'id': 'change relay slave ID (1..247), relay reboot required'
         }
Пример #5
0
 def get(self, port=None, cfg=None, timeout=0):
     try:
         if not eva.uc.i2cbus.lock(self.bus):
             raise Exception('Unable to lock I2C bus %s ' % self.bus)
         b = self.smbus2.SMBus(self.bus)
         time_start = time.time()
         rd = False
         while time_start + timeout >= time.time():
             try:
                 t, p, h = self.readBME280All(bus=b, addr=self.addr)
                 if t is not None and p is not None and h is not None:
                     rd = True
                     break
             except:
                 pass
             time.sleep(bus_delay)
         eva.uc.i2cbus.release(self.bus)
         if not rd: raise Exception('data read error')
         return {
             't': int(t * 100) / 100.0,
             'p': int(p * 100) / 100.0,
             'h': int(h * 100) / 100.0
         }
     except:
         log_traceback()
         return None
Пример #6
0
 def test(self, cmd=None):
     if cmd == 'self':
         try:
             identity = self.proxy.operate('list_identity')
             return 'OK'
         except:
             log_traceback()
             return 'FAILED'
     elif cmd == 'info':
         identity = self.proxy.operate('list_identity')
         return {
             'product_name': str(identity.get('product_name')),
             'serial_number': str(identity.get('serial_number'))
         }
     elif cmd == 'get':
         if self.tags:
             return self.get(timeout=get_timeout())
         else:
             return 'tag list not specified'
     elif cmd == 'help':
         return {
             'info': 'get equpment identity',
             'get': 'get all tags',
             '<TAG>': 'get tag value'
         }
     else:
         return self.get(port=cmd, timeout=get_timeout())
Пример #7
0
 def get(self, port=None, cfg=None, timeout=0):
     if cfg:
         relay_host, relay_port = parse_host_port(cfg.get('host'), 6722)
     else:
         relay_host = None
     if not relay_host:
         relay_host = self.relay_host
         relay_port = self.relay_port
     if not relay_host:
         self.log_error('no host specified')
         return None
     server = (relay_host, relay_port)
     try:
         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         sock.settimeout(timeout)
         try:
             sock.connect(server)
             sock.send('00'.encode())
             res = sock.recv(8).decode()
             sock.close()
         except:
             sock.close()
             raise
         if len(res) < 8: raise Exception('bad data received')
         result = {}
         for i in range(8):
             result[str(i + 1)] = int(res[i])
         return result
     except:
         log_traceback()
         return None
Пример #8
0
def set(oid,
        value,
        host,
        port=161,
        community='private',
        timeout=0,
        retries=0,
        snmp_ver=2):
    try:
        for (err_i, err_st, err_idx, vals) in snmp_engine.setCmd(
                snmp_engine.SnmpEngine(),
                snmp_engine.CommunityData(community, mpModel=snmp_ver - 1),
                snmp_engine.UdpTransportTarget((host, port),
                                               timeout=timeout,
                                               retries=retries),
                snmp_engine.ContextData(),
                snmp_engine.ObjectType(snmp_engine.ObjectIdentity(oid),
                                       value)):
            if err_i or err_st:
                logging.debug('snmp error: %s' % err_i)
                return None
            else:
                return True
    except:
        log_traceback()
        return False
Пример #9
0
 def unload(self):
     for p, d in self.devices.items():
         try:
             d.close()
         except:
             log_traceback()
     self.devices = []
Пример #10
0
 def stop(self):
     for d in self.devices:
         try:
             d.off()
             d.close()
         except:
             log_traceback()
     self.devices = []
Пример #11
0
 def unload(self):
     try:
         result = requests.delete(self.api_uri, timeout=get_timeout())
         if not result.ok:
             raise Exception
     except:
         self.log_warning('unable to delete token')
         log_traceback()
Пример #12
0
 def mqtt_state_handler(self, data, topic, qos, retain):
     try:
         state = json.loads(data)
         if state.get('RfReceived', {}).get('Data') == self.sensor_id:
             with self.state_lock:
                 self.current_state = 1
                 self.state_set_time = time.time()
                 handle_phi_event(self, 1, self.get())
     except:
         log_traceback()
Пример #13
0
 def get(self, port=None, cfg=None, timeout=0):
     try:
         result = requests.get('{}/lights/{}'.format(self.api_uri, port),
                               timeout=timeout).json()
         if 'state' in result:
             return 1 if result['state'].get('on') else 0
     except:
         self.log_error('unable to get state, port {}'.format(port))
         log_traceback()
         return None
Пример #14
0
 def unload(self):
     try:
         result = requests.delete('{}/config/whitelist/{}'.format(
             self.api_uri, self.user),
                                  timeout=get_timeout()).json()
         if 'success' not in result[0]:
             raise Exception
     except:
         self.log_warning('unable to delete user from the bridge')
         log_traceback()
Пример #15
0
 def get(self, port=None, cfg=None, timeout=0):
     try:
         if port:
             tag, tp = self._parse_tag(port)
             if not tp:
                 tp = cfg.get('type') if cfg else None
             if tp == 'BOOL':
                 if tag.endswith(']'):
                     tag, bit = tag.rsplit('[', 1)
                     bit = bit[:-1]
                 else:
                     bit = '0'
                 args = self.bitman + [tag, bit, '--timeout', str(timeout)]
                 self.log_debug(f'executing {" ".join(args)}')
                 p = subprocess.run(args,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)
                 if p.returncode != 0:
                     self.log_error(p.stderr)
                 else:
                     result = int(p.stdout)
                     if self._has_feature.value:
                         return 1, result
                     else:
                         return result
             else:
                 ttg = [tag]
         else:
             ttg = self.tags
         if not ttg:
             return None
         result = {}
         data = self.proxy.operate('read', ttg)
         for i, v in enumerate(data):
             if v is not None:
                 values = []
                 for val in v if isinstance(v, list) else [v]:
                     try:
                         values.append(round(val, self.fp))
                     except:
                         values.append(val)
                 value = ','.join([str(val) for val in values])
                 result[ttg[i]] = str(value)
             else:
                 self.log_error(f'Unable to read {ttg[i]}')
         if not result:
             return None
         elif port:
             return result[port]
         else:
             return result
     except:
         log_traceback()
         return None
Пример #16
0
 def test(self, cmd=None):
     if cmd == 'self':
         try:
             if not os.path.isdir('/sys/bus/gpio'):
                 raise Exception('gpio bus not found')
             else:
                 return 'OK'
         except:
             log_traceback()
             return 'FAILED'
     return {'-': 'only self test command available'}
Пример #17
0
 def get(self, port=None, cfg=None, timeout=0):
     data = self.get_cached_state()
     if data is None:
         try:
             data = self.engine.get_current(timeout=timeout)
             if not data: return None
             self.set_cached_state(data)
         except:
             log_traceback()
             return None
     if port is None: return data
     return data.get(port)
Пример #18
0
 def test(self, cmd=None):
     if cmd == 'module':
         return 'default' if not netsnmp else 'netsnmp'
     if cmd == 'self' and self.snmp_host is None: return 'OK'
     if cmd == 'info' or cmd == 'self':
         if netsnmp:
             try:
                 sess = netsnmp.Session(
                     Version=2,
                     DestHost=self.snmp_host,
                     RemotePort=self.snmp_port,
                     Community=self.snmp_read_community,
                     Timeout=int(get_timeout() * 1000000),
                     Retries=self.snmp_tries - 1)
             except:
                 log_traceback()
                 sess = None
         if netsnmp:
             try:
                 name = sess.get(netsnmp.VarList(self.oid_name))[0].decode()
             except:
                 log_traceback()
                 name = None
         else:
             name = snmp.get(
                 self.oid_name,
                 self.snmp_host,
                 self.snmp_port,
                 self.snmp_read_community,
                 timeout=get_timeout(),
                 retries=self.snmp_tries - 1)
         if not name: return 'FAILED'
         if name and cmd == 'self': return 'OK'
         if netsnmp:
             try:
                 version = sess.get(netsnmp.VarList(
                     self.oid_version))[0].decode()
             except:
                 version = None
         else:
             version = snmp.get(
                 self.oid_version,
                 self.snmp_host,
                 self.snmp_port,
                 self.snmp_read_community,
                 timeout=get_timeout())
         if not version: return 'FAILED'
         return '%s %s' % (name.strip(), version.strip())
     return {
         'info': 'returns relay ip module name and version',
         'module': 'current SNMP module'
     }
Пример #19
0
 def push_state(self, payload):
     try:
         data = payload['data']
         self.data['bat'] = int(data[4:8], 16) / 100
         self.data['hum'] = int(data[12:14], 16) * 0.5
         self.data['pres'] = int(data[18:22], 16) / 10
         self.data['temp'] = int(data[26:30], 16) / 10
         self.data['gas'] = int(data[34:38], 16) / 100
         handle_phi_event(self, data=self.data)
         return True
     except:
         log_traceback()
         return False
Пример #20
0
 def test(self, cmd=None):
     if cmd in ['self', 'get']:
         try:
             u = self.api_uri
             result = requests.get(u, timeout=get_timeout()).json()
             if 'manufacturer' not in result:
                 raise Exception
             return 'OK' if cmd == 'self' else result
         except:
             log_traceback()
             return 'FAILED' if cmd == 'self' else None
     else:
         return {'get': 'get panel info'}
Пример #21
0
 def start(self):
     if self.ports:
         ports = self.ports
         if not isinstance(ports, list):
             ports = [ports]
         for p in ports:
             try:
                 d = self.gpiozero.DigitalOutputDevice(int(p))
                 d.on()
                 self.devices.append(d)
             except:
                 log_traceback()
                 self.log_error('can not power on gpio port %s' % p)
Пример #22
0
 def get(self, port=None, cfg=None, timeout=0):
     mb = modbus.get_port(self.modbus_port, timeout)
     if not mb: return None
     try:
         rr = mb.read_input_registers(30014, 2, unit=self.addr)
         mb.release()
         if rr.isError():
             self.log_debug(rr)
             return None
         return {'l': rr.registers[0] * 65536 + rr.registers[1]}
     except:
         log_traceback()
         return None
Пример #23
0
 def set(self, port=None, data=None, cfg=None, timeout=0):
     time_start = time()
     if cfg:
         addr = cfg.get('addr')
         if addr is None: addr = self.addr
     else: addr = self.addr
     if addr is None:
         self.log_error('1-Wire addr not specified')
         return False
     if not lock('w1:' + addr):
         self.log_error('can not acquire lock')
         return False
     try:
         if isinstance(port, list):
             _port = port
             _data = data
         else:
             _port = [port]
             _data = [data]
         r = self.safe_read(addr)
         if r is None:
             raise Exception('1-Wire get error')
         for i in range(0, len(_port)):
             _p = int(_port[i])
             _d = int(_data[i])
             if _p < 1 or _p > 8:
                 raise Exception('port is not in range 1..8')
             if _d < 0 or _d > 1:
                 raise Exception('data is not in range 0..1')
             if _d: r = 1 << (_p - 1) ^ 0xFF & r
             else: r = r | 1 << (_p - 1)
         if time_start + timeout <= time():
             raise Exception('1-Wire timeout')
         for i in range(self.retries + 1):
             try:
                 open('%s/%s/output' % (self.w1, addr), 'wb').write(
                     bytes([r]))
                 sleep(w1_delay)
                 rn = self.safe_read(addr)
             except:
                 rn = None
             if r == rn: break
             if i == self.retries: raise Exception('1-Wire set error')
             if time_start + timeout <= time():
                 raise Exception('1-Wire timeout')
         unlock('w1:' + addr)
         return True
     except:
         unlock('w1:' + addr)
         log_traceback()
         return False
Пример #24
0
 def test(self, cmd=None):
     if cmd == 'self':
         try:
             if os.path.isdir('/sys/bus/gpio'):
                 return 'OK'
             else:
                 raise Exception('gpio bus not found')
         except:
             log_traceback()
             return 'FAILED'
     elif cmd == 'get':
         return self.get(timeout=get_timeout())
     else:
         return {'get', 'Return current sensor state'}
Пример #25
0
 def push_state(self, payload):
     if payload == 'test':
         return True
     else:
         for port, v in payload.items():
             try:
                 if port in self.data:
                     self.data[port] = v
                 else:
                     raise LookupError(f'Port {port} not found')
             except:
                 log_traceback()
                 return False
         return True
Пример #26
0
 def get(self, port=None, cfg=None, timeout=0):
     mb = modbus.get_port(self.modbus_port, timeout)
     if not mb: return None
     try:
         rr = mb.read_input_registers(30002, 2, unit=self.addr)
         mb.release()
         if rr.isError():
             self.log_debug(rr)
             return None
         temp = rr.registers[0]
         if temp > 32767: temp = temp - 65536
         return {'t': temp / 100, 'h': rr.registers[1] / 100}
     except:
         log_traceback()
         return None
Пример #27
0
 def get(self, port=None, cfg=None, timeout=0):
     if port is None: return None
     for i in range(self.retries + 1):
         try:
             r = open('%s/%s/w1_slave' % (self.w1, port)).readlines()
             if r[0].strip()[-3:] != 'YES': return None
             d, val = r[1].strip().split('=')
             val = float(val) / 1000
             return val
         except:
             if i == self.retries:
                 log_traceback()
             else:
                 sleep(w1_delay)
     return None
Пример #28
0
 def set(self, port=None, data=None, cfg=None, timeout=0):
     try:
         ops = []
         bitman_ops = []
         for p, v in zip(port if isinstance(port, list) else [port],
                         data if isinstance(data, list) else [data]):
             tp = cfg.get('type') if cfg else None
             if not tp:
                 tp = self.tag_types.get(p)
             if tp == 'BOOL':
                 if p.endswith(']'):
                     tag, bit = p.rsplit('[', 1)
                     bit = bit[:-1]
                 else:
                     tag = p
                     bit = '0'
                 val = v[1] if isinstance(v, tuple) or isinstance(
                     v, list) else v
                 bitman_ops.append([tag, bit, str(val)])
             else:
                 op = f'{port}='
                 if tp:
                     op += f'({tp.upper()})'
                 op += str(v[1]) if isinstance(v, tuple) or isinstance(
                     v, list) else str(v)
                 ops.append(op)
         success = True
         if ops:
             self.log_debug(f'EnIP OP {" ".join(ops)}')
             result = self.proxy.operate('write', ops)
             for op, r in zip(ops, result):
                 if r is not True:
                     self.log_error(f'tag set {op} error')
                     success = False
         if bitman_ops:
             for op in bitman_ops:
                 args = self.bitman + op + ['--timeout', str(timeout)]
                 self.log_debug(f'executing {" ".join(args)}')
                 p = subprocess.run(args,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)
                 if p.returncode != 0:
                     self.log_error(p.stderr)
                     success = False
         return success
     except:
         log_traceback()
         return False
Пример #29
0
 def test(self, cmd=None):
     if cmd in ['self', 'get', 'new']:
         c = 'lights'
         if cmd == 'new':
             c = 'lights/new'
         try:
             result = requests.get('{}/{}'.format(self.api_uri, c),
                                   timeout=get_timeout()).json()
             if isinstance(result, list):
                 raise Exception
             return 'OK' if cmd == 'self' else result
         except:
             log_traceback()
             return 'FAILED' if cmd == 'self' else None
     else:
         return {'get': 'get state of all lights', 'new': 'get new lights'}
Пример #30
0
 def get(self, port=None, cfg=None, timeout=0):
     mb = modbus.get_port(self.modbus_port, timeout)
     if not mb: return None
     try:
         rr = mb.read_holding_registers(3000, 2, unit=self.unit_id)
         mb.release()
         if rr.isError():
             self.log_debug(rr)
             return None
         val = struct.unpack(
             'f',
             struct.pack('H', rr.registers[0]) +
             struct.pack('H', rr.registers[1]))[0]
         return (1, '{:.2f}'.format(val)) if val > 0 else 0
     except:
         log_traceback()
         return None