React to update packet - people/person on a device have changed

        :param packet: Packet from client with changes
        :type packet: paps.si.app.message.APPUpdateMessage
        :param ip: Client ip address
        :type ip: unicode
        :param port: Client port
        :type port: int
        :rtype: None

def _do_update_packet(self, packet, ip, port):
        """
        React to update packet - people/person on a device have changed

        :param packet: Packet from client with changes
        :type packet: paps.si.app.message.APPUpdateMessage
        :param ip: Client ip address
        :type ip: unicode
        :param port: Client port
        :type port: int
        :rtype: None
        """
        self.debug("()")
        device_id = packet.header.device_id
        if device_id <= Id.SERVER:
            self.error("ProtocolViolation: Invalid device id")
            return
        client = self._clients.get(device_id, None)
        if not client:
            self.error("ProtocolViolation: Client is not registered")
            return
        key = u"{}:{}".format(ip, port)
        if client['key'] != key:
            self.error(
                u"ProtocolViolation: Client key ({}) has changed: {}".format(
                    client['key'], key
                )
            )
            return

        # Packet info seems ok
        try:
            people = packet.people()
        except ProtocolViolation:
            self.exception("Failed to decode people from packet")
            return

        # Verify same number of people in update as registered to client
        # (APP specific)
        if len(people) != len(client['people']):
            self.error("ProtocolViolation: Incorrect number of people updated")
        changed = []
        # Add ids to all people
        # Assumes same order here as on the client (e.g from the join())
        for index, person in enumerate(people):
            old = client['people'][index]
            person.id = old.id
            if person != old:
                old.sitting = person.sitting
                # Maybe sent person to protect access to local saved state
                changed.append(old)
        if changed:
            # Only update if there is really a change
            try:
                self.changer.on_person_update(changed)
            except:
                self.exception("Failed to notify people update")
                return
        else:
            self.debug("No people updated")