Ejemplo n.º 1
0
class Led(Plugin):
    implements(ITelldusLiveObserver)

    def __init__(self):
        self.gpio = Gpio(self.context)
        self.live = TelldusLive(self.context)
        self.gpio.initPin('status:red')
        self.gpio.initPin('status:green')
        self.setNetworkLed()

    def liveConnected(self):
        self.setNetworkLed()

    def liveRegistered(self, __msg, __refreshRequired):
        self.setNetworkLed()

    def liveDisconnected(self):
        self.setNetworkLed()

    def setNetworkLed(self):
        if self.live.isRegistered():
            # We check live status first since we might have connection on another network interface
            self.gpio.setPin('status:red', 0)
            self.gpio.setPin('status:green', 1, brightness=50)
            return
        if self.live.isConnected():
            self.gpio.setPin('status:red', 0)
            self.gpio.setPin('status:green', 1, brightness=50, freq=1)
            return
        if Led.__getIp(Board.networkInterface()) is None:
            self.gpio.setPin('status:red', 1, freq=1)
            self.gpio.setPin('status:green', 0)
            return
        self.gpio.setPin('status:red', 1, brightness=50)
        self.gpio.setPin('status:green', 0)

    @staticmethod
    def __getIp(iface):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sockfd = sock.fileno()
        SIOCGIFADDR = 0x8915  # pylint:disable=C0103
        ifreq = struct.pack('16sH14s', str(iface), socket.AF_INET, '\x00' * 14)
        try:
            res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq)
        except Exception as __error:
            return None
        ipAddr = struct.unpack('16sH2x4s8x', res)[2]
        return socket.inet_ntoa(ipAddr)