Кремень АH Реклама
Кремень М Реклама

Автоотключение KINGROON KLP1 с помощью WiFi реле.

olegr
Идет загрузка
Загрузка
16.08.2024
635
21
Техничка

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

3

Добрый день!

Предлагаю решение для автоотключения принтера KINGROON KLP1 с помощью WiFi реле.

Я думаю, что это решение также подойдет для любого принтера, работающего на Klipper'е и Fluidd.

Почитал мануал по Remote API https://moonraker.readthedocs.io/en/latest/web_api/ , потыкал в принтер запросами вида http://192.168.1.186/printer/objects/query?print_stats, где 192.168.1.186 - IP адрес моего принтера в локальной WiFi сети.

При этом в ответе принтер присылает статус трёх видов:

1. "state": "standby", - после включения

2. "state": "printing", - при печати

3. "state": "complete",

Дело за малым, взял реле SonoffBasic и нарукожопил прошивку, которая анализирует статус принтера раз в минуту. Как только статус изменится с  printing на complete, реле выключает питание принтера.

Запрос статуса:

const char * host = "192.168.1.186";
const uint16_t port = 80;
const char * url = "/printer/objects/query?print_stats";

int klp_status(void) {
    WiFiClient client;
    if (!client.connect(host, port)) { return KLP_NOT_CONNECT; }
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: ESP8266\r\n" + "Connection: close\r\n\r\n");
    while (client.connected()) {
        String line = client.readStringUntil('\n');
        if (line == "\r") { break; }
    }
    String line = client.readStringUntil('\n');
    client.stop();
    if (line.indexOf("state") == -1) { return KLP_NOT_STATE; }
    if (line.indexOf("standby") != -1) { return KLP_STANDBYE; }
    if (line.indexOf("printing") != -1) { return KLP_PRINT;}
    if (line.indexOf("complete") != -1) { return KLP_COMPLETE; }
    return KLP_UNKN_STATE;
}

Обработка:

void loop(void){
    static uint32_t oldT = KLP_QUERY_INTERVAL*10;
    int klp;
    server.handleClient();
    if (do_button()) { oldKlp = 0; }
    if (millis() - oldT > KLP_QUERY_INTERVAL) {
        klp = klp_status();
        if (klp == KLP_COMPLETE && oldKlp == KLP_PRINT) {
            digitalWrite(RELAY_PIN, !RELAY_ON);
            digitalWrite(LED_PIN, !LED_ON);
        }
        oldKlp = klp;
        oldT = millis();
    }
}

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

3
Комментарии к статье