Skocz do zawartości

Przystawka do Octoprinta V2.0


Pomocna odpowiedź

(edytowany)

Mały update: ponieważ na ścianie wisi mi centralka z kedrigernem na pokładzie postanowiłem użyć jej jako zdalnego wskaźnika stanu drukarki - co jest szczególnie ważne w przypadku, gdy drukuję coś z kilku warstw różnych filamentów, chcę wiedzieć kiedy mam przyjść i zmienić filament, a drukarka stoi w drugim końcu mieszkania.

Chwila toboty... i jest!

W centralce uruchamiam prosty program:

#!/usr/bin/env python3
import kedrigern, socket

def main():
    vox=kedrigern.Voice(tempo=0.85, freq=0.85)
    sock=socket.socket(socket.AF_INET, # Internet
                         socket.SOCK_DGRAM) # UDP
    sock.bind(("", 6006))
    while True:
        data, addr=sock.recvfrom(1024)
        print(data, addr)
        data = data.split(None,1)
        if len(data) == 2 and data[0] == b'#say':
            vox.say(data[1].decode('utf-8'))

if __name__ == '__main__':
    main()

Program jest uruchamiany przez systemd i ma za zadanie mówić wszystko, co mu przylezie na socket i zaczyna się od '#say'.

Musiałem nieco zmodyfikować plik octan.py obsługujący display. Program powinien wysyłać centralce odpowiedni komunikat, jeśli zmieni się stan drukarki. Ponieważ funkcja getStatus jest wywoływana w kilku, miejscach, postanowiłem tego nie zmieniać. Zamiast tego zmieniłem nazwę funkcji na _getStatus i dopisałem kawałek kodu:

statsy={
    b'err': 'wystąpił błąd',
    b'pau': 'pauza. Zmień filament',
    b'idl': 'bezczynna',
    b'prt': 'drukowanie',
    b'ccl': 'kancelacja wydruku',
    b'hea': 'podgrzewanie',
    b'off': 'wyłączona'
        }
drukarki = ['aneta','prusa']
    

def announce(nr,ste):
    global drukarki, statsy, udp
    kmn = '#say Drukarka %s: %s' % (drukarki[nr], statsy.get(ste,'hgw co ona chce'))
    udp.sendto(kmn.encode('utf-8'),('192.168.1.39',6006))

last_state=[b'off',b'off']
last_pause=[0,0]

def getStatus(nr=0):
    global last_state, last_pause
    rc=_getStatus(nr)
    try:
        s=rc.strip().split()[0]
        if s != last_state[nr]:
            if s == b'pau' and last_state != b'pau':
                last_pause[nr]=time.time()
            last_state[nr]=s
            announce(nr,s)
        elif last_state[nr] == b'pau' and time.time() - last_pause[nr] > 20:
            last_pause[nr] = time.time()
            announce(nr,b'pau')
    except:
        import traceback
        traceback.print_exc()
    return rc

Musiałem dodatkowo zmienić adres bindowania socketa UDP (teraz binduje do wszystkich interfejsów a nie tylko localhosta):

udp.bind(('', 3249))

Na razie działa 🙂

Edytowano przez ethanak
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.