docs: def datagram_received(self, data, addr):
          """Method run when data is received from the device
  
          This method will unpack the data according to the LIFX protocol.
          If the message represents some state information, it will update
          the device state. Following that it will execute the callback corresponding
          to the message sequence number. If there is no sequence number, the
          default callback will be called.
  
              :param data: raw data
              :type data: bytestring
              :param addr: sender IP address 2-tuple for IPv4, 4-tuple for IPv6
              :type addr: tuple
          """
          self.register()
          response = unpack_lifx_message(data)
          self.lastmsg=datetime.datetime.now()
          if response.seq_num in self.message:
              response_type,myevent,callb = self.message[response.seq_num]
              if type(response) == response_type:
                  if response.source_id == self.source_id:
                      if "State" in response.__class__.__name__:
                          setmethod="resp_set_"+response.__class__.__name__.replace("State","").lower()
                          if setmethod in dir(self) and callable(getattr(self,setmethod)):
                              getattr(self,setmethod)(response)
                      if callb:
                          callb(self,response)
                      myevent.set()
                  del(self.message[response.seq_num])
              elif type(response) == Acknowledgement:
                  pass
              else:
                  del(self.message[response.seq_num])
          elif self.default_callb:
              self.default_callb(response)