Skocz do zawartości

Przystawka do Octoprinta V2.0


ethanak

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.