LIFX Z LAN - свет не отвечает, когда пакеты отправляются быстро - PullRequest
0 голосов
/ 13 июня 2018

Итак, я пытался создать музыкальный визуализатор, который действительно работал бы в режиме реального времени.Я изо всех сил пытался заставить его работать, но потом, вчера, из ниоткуда, он начал работать, когда я добавил небольшую задержку после отправки пакетов.Я снял его и вуаля , он работал в режиме реального времени.

Так что я привел их домой позже, чтобы найти, что они все еще не работают в моей домашней сети, что я посчитал странным.Затем я возвращаю их сегодня в школу и обнаруживаю, что они больше не работают в школе!Что дает?Я так озадачен, почему эти вещи работают как очарование из ниоткуда, а затем перестают работать снова из ниоткуда.

Я пытаюсь добавить задержку, и она работает, но задержка настолько плоха, что этотрудно сказать, что он вообще реагирует на микрофон.

У меня есть мой GitHub здесь: https://github.com/HoldenGs/LIFX_controller

, а также вот соответствующий код:

#!/usr/bin/env python3

import time
import socket
import argparse
import random
import queue
import sys
from tools import get_colour_zones_packet, APPLY

RETRIES = 1
UDP_PORT = 56700
SEQ_NUM = random.randint(0, 255)


def int_or_str(text):
    """Helper function for argument parsing."""
    try:
        return int(text)
    except ValueError:
        return text


parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
    '-l', '--list-devices', action='store_true',
    help='show list of audio devices and exit')
parser.add_argument(
    '-d', '--device', type=int_or_str,
    help='input device (numeric ID or substring)')
parser.add_argument(
    '-w', '--window', type=float, default=200, metavar='DURATION',
    help='visible time slot (default: %(default)s ms)')
parser.add_argument(
    '-i', '--interval', type=float, default=30,
    help='minimum time between plot updates (default: %(default)s ms)')
parser.add_argument(
    '-b', '--blocksize', type=int, help='block size (in samples)')
parser.add_argument(
    '-r', '--samplerate', type=float, help='sampling rate of audio device')
parser.add_argument(
    '-n', '--downsample', type=int, default=10, metavar='N',
    help='display every Nth sample (default: %(default)s)')
parser.add_argument(
    'channels', type=int, default=[1], nargs='*', metavar='CHANNEL',
    help='input channels to plot (default: the first)')
args = parser.parse_args()
if any(c < 1 for c in args.channels):
    parser.error('argument CHANNEL: must be >= 1')

mapping = [c - 1 for c in args.channels]  # Channel numbers start with 1
q = queue.Queue(64)




def audio_callback(indata, frames, time, status):
    """This is called (from a separate thread) for each audio block."""
    if status:
        print(status, file=sys.stderr)
    # Fancy indexing with mapping creates a (necessary!) copy:
    q.put(indata[::args.downsample, mapping])


def update_lights(hue):
    """This is called by matplotlib for each plot update.
    Typically, audio callbacks happen more frequently than plot updates,
    therefore the queue tends to contain multiple blocks of audio data.
    """
    while True:
        try:
            data = q.get_nowait()
        except queue.Empty:
            break
        max_amp = max(data)[0] * 500
        if max_amp > 100:
            max_amp = 100
        if max_amp < 1:
            max_amp = 1
        print("amp: {}                 ".format(int(max_amp)), end="\r")
        bulb_ip = "192.168.1.5"
        start_index = 0
        end_index = 11
        sat = 0
        kel = 3500
        packet = get_colour_zones_packet(start_index, end_index,
                                        hue, sat, int(max_amp), kel, APPLY, SEQ_NUM)
        sock.sendto(packet, (bulb_ip, UDP_PORT))





if len(sys.argv) > 0:
    import numpy as np
    import sounddevice as sd
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    if args.list_devices:
        print(sd.query_devices())
        parser.exit(0)
    if args.samplerate is None:
        device_info = sd.query_devices(args.device, 'input')
        args.samplerate = device_info['default_samplerate']

    print("Starting...")
    # start stream
    stream = sd.InputStream(
        device=args.device, channels=max(args.channels),
        samplerate=args.samplerate, callback=audio_callback)
    try:
        with stream:
            hue = 0
            add = 1
            while True:
                # if add:
                #     hue += 0.00005
                #     if hue >= 255:
                #         add = 0
                #         hue = 255
                # else:
                #     hue -= 0.00005
                #     if hue <= 0:
                #         add = 1
                #         hue = 0
                update_lights(int(hue))
    except KeyboardInterrupt as e:
        parser.exit(type(e).__name__ + ': ' + str(e))
else:
    print("No lights with MultiZone capability detected.")

Я немного растерялся, как справиться с этой неуловимой проблемой.Любые советы очень ценятся!

1 Ответ

0 голосов
/ 13 июня 2018

Итак, чтобы ответить на мой собственный вопрос, кажется, что нет надежного способа управления этими источниками света без некоторого ограничения скорости, поэтому на данный момент у меня просто небольшая задержка в 0,025 секунды после отправки пакетов, что приводит к тому, что некоторые аудиовходы непоявляются в свете, но это все еще работает как элементарное решение.Если вы хотите проверить проект, он прямо здесь: https://github.com/HoldenGs/LIFX_controller

...