11 Commits

Author SHA1 Message Date
mikhail 34329e1550 crowsnest: 1280x960 -> 1600x1200 при 30 fps 2026-09-03 06:03:47 +03:00
mikhail 25f2d354a9 crowsnest: 1600x1200 -> 1280x960 при 30 fps 2026-09-03 05:59:48 +03:00
mikhail 1e7cd50df2 crowsnest: 1600x1200@30 (max_fps 30 от пользователя + разрешение до потолка 4:3) 2026-09-03 05:58:01 +03:00
mikhail 51ab8e0b10 crowsnest: разрешение камеры 1280x720 -> 800x600 2026-09-03 05:49:55 +03:00
mikhail 7ebf9171cc crowsnest: разрешение камеры 1280x960 -> 1280x720 для стабильных 15 fps 2026-09-03 05:48:14 +03:00
mikhail 02d184c7bf crowsnest: mode ustreamer вместо невалидного MJPG, focus_automatic_continuous вместо focus_auto 2026-09-03 05:44:19 +03:00
mikhail 0d43916a83 update_fw.sh: сравнивать версии без суффикса -dirty у klippy
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 05:35:49 +03:00
mikhail f29dc7c6ad update_fw.sh: флаг --no-build — прошивка готовых артефактов из ~/firmware
host прошивается через scripts/flash-linux.sh из ~/firmware/host_klipper.elf,
а не из out/, поэтому не зависит от порядка сборки.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 05:28:12 +03:00
mikhail 2209c0e1f9 update_fw.sh: явная диагностика crash-loop klipper-mcu после прошивки host
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 05:24:27 +03:00
mikhail a78afa3ec4 firmware/update_fw.sh: исправления по ревью
- can_has_uuid: без pipefail-ловушки grep -q (flashtool -q падал по EPIPE)
- убраны пред-проверки -q перед -r: Klipper с назначенным node id не отвечает на запрос UUID
- tee игнорирует SIGINT, trap INT — по Ctrl-C klipper всё равно запускается
- set -E: trap ERR срабатывает внутри функций; die печатает этап
- preflight различает «Moonraker недоступен» и «klippy не ready»
- host: проверка смены PID klipper-mcu и наличия /tmp/klipper_host_mcu
- wait_for по реальному времени; klippy.log проверяется только после последнего старта

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 05:15:22 +03:00
mikhail 80d487b08d Включить moonraker.conf, KlipperScreen.conf и sonar.conf в бэкап
Файлы не содержат секретов (API-ключи moonraker хранятся в printer_data/database).
В moonraker.conf уже учтена замена устаревшей опции env на virtualenv
для [update_manager KlipperScreen].
2026-09-03 05:10:49 +03:00
6 changed files with 235 additions and 38 deletions
-3
View File
@@ -7,8 +7,5 @@ autocommit.sh
moonraker-sql.db moonraker-sql.db
moonraker-obico.cfg moonraker-obico.cfg
moonraker-obico-update.cfg moonraker-obico-update.cfg
KlipperScreen.conf
sonar.conf
moonraker.conf
telegram.conf telegram.conf
.*.*.bkp .*.*.bkp
+22
View File
@@ -0,0 +1,22 @@
#
# MMU "Happy Hare edition" menus
#
[include mmu_klipperscreen.conf]
# To use this KlipperScreen panel, create a symlink:
# $MOONRAKER_OBICO_HOME/scripts/klipper_screen_obico_panel.py ->$KLIPPER_SCREEN_HOME/panels/obico.py
[menu __main more obico]
name: Obico
icon: network
panel: obico
#~# --- Do not edit below this line. This section is auto generated --- #~#
#~#
#~# [main]
#~# theme = colorized
#~# print_sort_dir = date_desc
#~# language = ru
#~#
#~# [graph Printer]
#~# extruder = False
#~#
+4 -5
View File
@@ -41,14 +41,13 @@ no_proxy: false
#v4l2ctl: # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of. #v4l2ctl: # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of.
[cam head] [cam head]
#mode: ustreamer mode: ustreamer
mode: MJPG
port: 8080 port: 8080
#device: /dev/v4l/by-path/platform-5101000.usb-usb-0:1.1:1.0-video-index0 #device: /dev/v4l/by-path/platform-5101000.usb-usb-0:1.1:1.0-video-index0
device: /dev/v4l/by-id/usb-DSJ_UC60_Video_200901010001-video-index0 device: /dev/v4l/by-id/usb-DSJ_UC60_Video_200901010001-video-index0
resolution: 1280x960 #176x144, 320x240, 352x288, 640x480, 640x360, 640x400, 800x600, 1024x768, 1280x720, 1280x960, 1600x1200, 1920x1080, 2048x1536, 2560x1440, 2592x1944 resolution: 1600x1200 #176x144, 320x240, 352x288, 640x480, 640x360, 640x400, 800x600, 1024x768, 1280x720, 1280x960, 1600x1200, 1920x1080, 2048x1536, 2560x1440, 2592x1944
max_fps: 15 max_fps: 30
v4l2ctl: focus_auto=0 #brightness=-10, backlight_compensation=0 v4l2ctl: focus_automatic_continuous=0 #brightness=-10, backlight_compensation=0
#[cam bed_cam] #[cam bed_cam]
#mode: ustreamer #mode: ustreamer
+77 -27
View File
@@ -5,9 +5,10 @@
# toolhead — EBB SB2209 (rp2040; прошивается по CAN через katapult) # toolhead — EBB SB2209 (rp2040; прошивается по CAN через katapult)
# #
# Использование: # Использование:
# update_fw.sh [-h] [--build-only] [--force] [host|mcu|toolhead ...] # update_fw.sh [-h] [--build-only|--no-build] [--force] [host|mcu|toolhead ...]
# без целей — все три # без целей — все три
# --build-only — только собрать прошивки в ~/firmware, ничего не прошивать # --build-only — только собрать прошивки в ~/firmware, ничего не прошивать
# --no-build — не собирать, прошить уже собранные ~/firmware/<цель>_klipper.{bin,elf}
# --force — не останавливаться, если Moonraker недоступен для проверки печати # --force — не останавливаться, если Moonraker недоступен для проверки печати
# #
# Исходники Klipper НЕ обновляются (это делает Moonraker Update Manager). # Исходники Klipper НЕ обновляются (это делает Moonraker Update Manager).
@@ -24,7 +25,7 @@
# rp_sb2209 = 350f10596216 # rp_sb2209 = 350f10596216
# sht36_v2 = 8ce295109ef0 # sht36_v2 = 8ce295109ef0
set -euo pipefail set -Eeuo pipefail
# ---------- Константы ---------- # ---------- Константы ----------
MOONRAKER="http://127.0.0.1:7125" MOONRAKER="http://127.0.0.1:7125"
@@ -50,24 +51,27 @@ ALL_TARGETS=(host mcu toolhead)
# ---------- Разбор аргументов ---------- # ---------- Разбор аргументов ----------
BUILD_ONLY=0 BUILD_ONLY=0
NO_BUILD=0
FORCE=0 FORCE=0
TARGETS=() TARGETS=()
for arg in "$@"; do for arg in "$@"; do
case "$arg" in case "$arg" in
-h|--help) sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; -h|--help) sed -n '2,16p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'; exit 0 ;;
--build-only) BUILD_ONLY=1 ;; --build-only) BUILD_ONLY=1 ;;
--no-build) NO_BUILD=1 ;;
--force) FORCE=1 ;; --force) FORCE=1 ;;
host|mcu|toolhead) TARGETS+=("$arg") ;; host|mcu|toolhead) TARGETS+=("$arg") ;;
*) echo "Неизвестный аргумент: $arg (см. -h)" >&2; exit 2 ;; *) echo "Неизвестный аргумент: $arg (см. -h)" >&2; exit 2 ;;
esac esac
done done
[ ${#TARGETS[@]} -eq 0 ] && TARGETS=("${ALL_TARGETS[@]}") [ ${#TARGETS[@]} -eq 0 ] && TARGETS=("${ALL_TARGETS[@]}")
[ "$BUILD_ONLY" = 1 ] && [ "$NO_BUILD" = 1 ] && { echo "--build-only и --no-build несовместимы" >&2; exit 2; }
want() { local t; for t in "${TARGETS[@]}"; do [ "$t" = "$1" ] && return 0; done; return 1; } want() { local t; for t in "${TARGETS[@]}"; do [ "$t" = "$1" ] && return 0; done; return 1; }
# ---------- Лог и трапы ---------- # ---------- Лог и трапы ----------
mkdir -p "$OUT_DIR" mkdir -p "$OUT_DIR"
LOG="$OUT_DIR/update_fw-$(date +%Y%m%d-%H%M).log" LOG="$OUT_DIR/update_fw-$(date +%Y%m%d-%H%M).log"
exec > >(tee -a "$LOG") 2>&1 exec > >(trap '' INT; exec tee -a "$LOG") 2>&1
START_TS=$(date +%s) START_TS=$(date +%s)
STAGE="инициализация" STAGE="инициализация"
KLIPPER_STOPPED=0 KLIPPER_STOPPED=0
@@ -88,22 +92,25 @@ on_exit() {
} }
trap on_err ERR trap on_err ERR
trap on_exit EXIT trap on_exit EXIT
trap 'exit 130' INT
section() { echo; echo "=== $* ==="; } section() { echo; echo "=== $* ==="; }
die() { echo "!!! $*" >&2; exit 1; } die() { echo "!!! [$STAGE] $*" >&2; exit 1; }
# Ждать, пока команда-условие не вернёт 0 (таймаут в секундах) # Ждать, пока команда-условие не вернёт 0 (таймаут в секундах)
wait_for() { wait_for() {
local timeout=$1 msg=$2; shift 2 local timeout=$1 msg=$2; shift 2
local i local deadline=$((SECONDS + timeout))
for ((i = 0; i < timeout; i++)); do while [ "$SECONDS" -lt "$deadline" ]; do
if "$@" >/dev/null 2>&1; then return 0; fi if "$@" >/dev/null 2>&1; then return 0; fi
sleep 1 sleep 1
done done
echo "!!! Таймаут ($timeout с): $msg" >&2 echo "!!! Таймаут ($timeout с): $msg" >&2
return 1 return 1
} }
can_has_uuid() { python3 "$KATAPULT" -i "$CAN_IF" -q 2>/dev/null | grep -q "$1"; } # Klipper отвечает на запрос UUID только пока ему не назначен node id (canserial.c),
# поэтому -q годится лишь для узлов, только что перезагруженных после прошивки.
can_has_uuid() { local out; out=$(python3 "$KATAPULT" -i "$CAN_IF" -q 2>/dev/null) || return 1; grep -q "$1" <<< "$out"; }
katapult_serial() { local d; for d in $KATAPULT_SERIAL_GLOB; do [ -e "$d" ] && { echo "$d"; return 0; }; done; return 1; } katapult_serial() { local d; for d in $KATAPULT_SERIAL_GLOB; do [ -e "$d" ] && { echo "$d"; return 0; }; done; return 1; }
klippy_state() { curl -s --max-time 5 "$MOONRAKER/printer/info" | jq -r '.result.state // empty' 2>/dev/null; } klippy_state() { curl -s --max-time 5 "$MOONRAKER/printer/info" | jq -r '.result.state // empty' 2>/dev/null; }
klippy_ready() { [ "$(klippy_state)" = "ready" ]; } klippy_ready() { [ "$(klippy_state)" = "ready" ]; }
@@ -116,7 +123,7 @@ mcu_versions() {
# ---------- Preflight ---------- # ---------- Preflight ----------
STAGE="предварительные проверки" STAGE="предварительные проверки"
section "Preflight" section "Preflight"
echo "Цели: ${TARGETS[*]} build-only=$BUILD_ONLY лог: $LOG" echo "Цели: ${TARGETS[*]} build-only=$BUILD_ONLY no-build=$NO_BUILD лог: $LOG"
[ -d "$KLIPPER" ] || die "Нет исходников Klipper: $KLIPPER" [ -d "$KLIPPER" ] || die "Нет исходников Klipper: $KLIPPER"
[ -f "$KATAPULT" ] || die "Нет katapult flashtool: $KATAPULT" [ -f "$KATAPULT" ] || die "Нет katapult flashtool: $KATAPULT"
@@ -127,6 +134,23 @@ want toolhead && { [ -f "$CONFIG_DIR/$TOOLHEAD_CFG" ] || die "Нет конфи
KLIPPER_VER=$(git -C "$KLIPPER" describe --always --tags --long --dirty 2>/dev/null || echo unknown) KLIPPER_VER=$(git -C "$KLIPPER" describe --always --tags --long --dirty 2>/dev/null || echo unknown)
echo "Klipper в $KLIPPER: $KLIPPER_VER" echo "Klipper в $KLIPPER: $KLIPPER_VER"
# Артефакт цели: ~/firmware/<цель>_klipper.<bin|elf> (симлинк на <цель>-<версия>.<ext>)
artifact() { case "$1" in host) echo "$OUT_DIR/host_klipper.elf" ;; *) echo "$OUT_DIR/$1_klipper.bin" ;; esac; }
if [ "$NO_BUILD" = 1 ]; then
echo "Без сборки — используются готовые прошивки:"
for t in "${TARGETS[@]}"; do
f=$(artifact "$t")
[ -s "$f" ] || die "Нет готовой прошивки $f (соберите: $0 --build-only $t)"
real=$(readlink -f "$f")
echo " $t: $(basename "$real") ($(stat -c %s "$real") байт)"
case "$(basename "$real")" in
*"-${KLIPPER_VER}."*) ;;
*) echo " !!! $t: прошивка собрана не из текущего $KLIPPER_VER" ;;
esac
done
fi
BEFORE="" BEFORE=""
if [ "$BUILD_ONLY" = 0 ]; then if [ "$BUILD_ONLY" = 0 ]; then
if want mcu || want toolhead; then if want mcu || want toolhead; then
@@ -134,14 +158,17 @@ if [ "$BUILD_ONLY" = 0 ]; then
fi fi
# Печать не должна идти # Печать не должна идти
KSTATE=$(klippy_state || true)
PRINT_STATE=$(curl -s --max-time 5 "$MOONRAKER/printer/objects/query?print_stats" \ PRINT_STATE=$(curl -s --max-time 5 "$MOONRAKER/printer/objects/query?print_stats" \
| jq -r '.result.status.print_stats.state // empty' 2>/dev/null || true) | jq -r '.result.status.print_stats.state // empty' 2>/dev/null || true)
if [ -z "$PRINT_STATE" ]; then if [ -z "$KSTATE" ]; then
if [ "$FORCE" = 1 ]; then if [ "$FORCE" = 1 ]; then
echo "Moonraker недоступен, проверка печати пропущена (--force)" echo "Moonraker недоступен, проверка печати пропущена (--force)"
else else
die "Moonraker недоступен — не могу проверить, идёт ли печать (--force чтобы пропустить)" die "Moonraker недоступен — не могу проверить, идёт ли печать (--force чтобы пропустить)"
fi fi
elif [ -z "$PRINT_STATE" ]; then
echo "klippy в состоянии '$KSTATE' (не ready) — печать не идёт, продолжаю"
else else
echo "print_stats.state = $PRINT_STATE" echo "print_stats.state = $PRINT_STATE"
case "$PRINT_STATE" in case "$PRINT_STATE" in
@@ -173,14 +200,15 @@ build() { # build <цель> <конфиг> <артефакт: bin|elf>
[ -s "$src" ] || die "Сборка $name не дала $src" [ -s "$src" ] || die "Сборка $name не дала $src"
local dst="$OUT_DIR/${name}-${KLIPPER_VER}.$ext" local dst="$OUT_DIR/${name}-${KLIPPER_VER}.$ext"
cp "$src" "$dst" cp "$src" "$dst"
ln -sfn "$(basename "$dst")" "$OUT_DIR/${name}_klipper.$ext" ln -sfn "$(basename "$dst")" "$(artifact "$name")"
echo "-> $dst ($(stat -c %s "$dst") байт)" echo "-> $dst ($(stat -c %s "$dst") байт)"
} }
# host собирается последним: его out/ нужен для make flash if [ "$NO_BUILD" = 0 ]; then
want mcu && build mcu "$MCU_CFG" bin want mcu && build mcu "$MCU_CFG" bin
want toolhead && build toolhead "$TOOLHEAD_CFG" bin want toolhead && build toolhead "$TOOLHEAD_CFG" bin
want host && build host "$HOST_CFG" elf want host && build host "$HOST_CFG" elf
fi
if [ "$BUILD_ONLY" = 1 ]; then if [ "$BUILD_ONLY" = 1 ]; then
section "Готово (только сборка)" section "Готово (только сборка)"
@@ -197,22 +225,37 @@ KLIPPER_STOPPED=1
if want host; then if want host; then
STAGE="прошивка host MCU" STAGE="прошивка host MCU"
section "Прошивка host (klipper-mcu)" section "Прошивка host (klipper-mcu)"
# flash-linux.sh копирует out/klipper.elf в /usr/local/bin/klipper_mcu и перезапускает klipper-mcu # flash-linux.sh <dir> копирует <dir>/klipper.elf в /usr/local/bin/klipper_mcu и перезапускает klipper-mcu.
make -C "$KLIPPER" flash KCONFIG_CONFIG="$BUILD_TMP/$HOST_CFG" # Подсовываем ему каталог с артефактом из ~/firmware, а не out/ (там может быть сборка другой цели)
mkdir -p "$BUILD_TMP/host"
cp "$(artifact host)" "$BUILD_TMP/host/klipper.elf"
HOST_PID_OLD=$(systemctl show -p ExecMainPID --value klipper-mcu)
sudo "$KLIPPER/scripts/flash-linux.sh" "$BUILD_TMP/host"
[ "$(stat -c %Y "$HOST_BIN")" -ge "$START_TS" ] || die "$HOST_BIN не обновился" [ "$(stat -c %Y "$HOST_BIN")" -ge "$START_TS" ] || die "$HOST_BIN не обновился"
wait_for 10 "klipper-mcu не запустился" systemctl is-active --quiet klipper-mcu host_restarted() {
echo "klipper-mcu: $(systemctl is-active klipper-mcu), $HOST_BIN обновлён" [ "$(systemctl show -p ExecMainPID --value klipper-mcu)" != "$HOST_PID_OLD" ] \
&& [ "$(systemctl show -p SubState --value klipper-mcu)" = "running" ] && [ -e /tmp/klipper_host_mcu ]
}
if ! wait_for 10 "klipper-mcu не перезапустился (PID $HOST_PID_OLD)" host_restarted; then
journalctl -u klipper-mcu -n 8 --no-pager -o cat || true
die "klipper-mcu не работает после прошивки (см. journalctl -u klipper-mcu)"
fi
# Убедиться, что процесс не падает в цикле перезапуска (Restart=always)
sleep 3
[ "$(systemctl show -p SubState --value klipper-mcu)" = "running" ] \
|| { journalctl -u klipper-mcu -n 8 --no-pager -o cat || true; die "klipper-mcu перезапускается в цикле"; }
echo "klipper-mcu перезапущен (PID $HOST_PID_OLD -> $(systemctl show -p ExecMainPID --value klipper-mcu)), $HOST_BIN обновлён"
fi fi
if want mcu; then if want mcu; then
STAGE="прошивка Octopus Pro" STAGE="прошивка Octopus Pro"
section "Прошивка mcu (Octopus Pro, uuid $MCU_UUID)" section "Прошивка mcu (Octopus Pro, uuid $MCU_UUID)"
can_has_uuid "$MCU_UUID" || die "Octopus ($MCU_UUID) не виден на $CAN_IF"
python3 "$KATAPULT" -i "$CAN_IF" -u "$MCU_UUID" -r python3 "$KATAPULT" -i "$CAN_IF" -u "$MCU_UUID" -r
wait_for 20 "не появился katapult serial ($KATAPULT_SERIAL_GLOB). Проверьте USB или перезагрузите плату" katapult_serial wait_for 20 "не появился katapult serial ($KATAPULT_SERIAL_GLOB). Проверьте USB или перезагрузите плату" katapult_serial
DEV=$(katapult_serial) DEV=$(katapult_serial)
echo "katapult serial: $DEV" echo "katapult serial: $DEV"
python3 "$KATAPULT" -d "$DEV" -f "$OUT_DIR/mcu_klipper.bin" sleep 1 # порт может быть ещё не готов сразу после появления симлинка
python3 "$KATAPULT" -d "$DEV" -f "$(artifact mcu)"
# После прошивки плата перезагружается в Klipper и снова поднимает USB-CAN мост # После прошивки плата перезагружается в Klipper и снова поднимает USB-CAN мост
wait_for 30 "Octopus не вернулся на $CAN_IF после прошивки" can_has_uuid "$MCU_UUID" wait_for 30 "Octopus не вернулся на $CAN_IF после прошивки" can_has_uuid "$MCU_UUID"
echo "Octopus снова на $CAN_IF" echo "Octopus снова на $CAN_IF"
@@ -221,8 +264,8 @@ fi
if want toolhead; then if want toolhead; then
STAGE="прошивка тулхеда" STAGE="прошивка тулхеда"
section "Прошивка toolhead (EBB SB2209, uuid $TOOLHEAD_UUID)" section "Прошивка toolhead (EBB SB2209, uuid $TOOLHEAD_UUID)"
can_has_uuid "$TOOLHEAD_UUID" || die "Тулхед ($TOOLHEAD_UUID) не виден на $CAN_IF" # flashtool сам отправляет запрос бутлоадера по UUID и заливает прошивку
python3 "$KATAPULT" -i "$CAN_IF" -u "$TOOLHEAD_UUID" -f "$OUT_DIR/toolhead_klipper.bin" python3 "$KATAPULT" -i "$CAN_IF" -u "$TOOLHEAD_UUID" -f "$(artifact toolhead)"
wait_for 30 "тулхед не вернулся на $CAN_IF после прошивки" can_has_uuid "$TOOLHEAD_UUID" wait_for 30 "тулхед не вернулся на $CAN_IF после прошивки" can_has_uuid "$TOOLHEAD_UUID"
echo "Тулхед снова на $CAN_IF" echo "Тулхед снова на $CAN_IF"
fi fi
@@ -249,16 +292,23 @@ fi
section "Версии" section "Версии"
KLIPPY_VER=$(curl -s --max-time 5 "$MOONRAKER/printer/info" | jq -r '.result.software_version // "?"' 2>/dev/null || echo "?") KLIPPY_VER=$(curl -s --max-time 5 "$MOONRAKER/printer/info" | jq -r '.result.software_version // "?"' 2>/dev/null || echo "?")
echo "klippy (хост): $KLIPPY_VER" echo "klippy (хост): $KLIPPY_VER"
# klippy считает untracked-файлы в klippy/extras (autotune, Happy-Hare) как -dirty, прошивки — нет
KLIPPY_VER=${KLIPPY_VER%-dirty}
AFTER=$(mcu_versions) AFTER=$(mcu_versions)
printf '%-12s %-32s %s\n' "MCU" "было" "стало"
MISMATCH=0 MISMATCH=0
while IFS=$'\t' read -r name ver _; do if [ -z "$AFTER" ] || [ "$AFTER" = "недоступно" ]; then
echo "!!! Версии MCU недоступны (klippy не ready)"; MISMATCH=1
else
printf '%-12s %-32s %s\n' "MCU" "было" "стало"
while IFS=$'\t' read -r name ver _; do
old=$(printf '%s\n' "$BEFORE" | awk -F'\t' -v n="$name" '$1==n{print $2}') old=$(printf '%s\n' "$BEFORE" | awk -F'\t' -v n="$name" '$1==n{print $2}')
printf '%-12s %-32s %s\n' "$name" "${old:-?}" "$ver" printf '%-12s %-32s %s\n' "$name" "${old:-?}" "$ver"
[ "$ver" = "$KLIPPY_VER" ] || { echo "!!! $name: версия $ver != klippy $KLIPPY_VER"; MISMATCH=1; } [ "$ver" = "$KLIPPY_VER" ] || { echo "!!! $name: версия $ver != klippy $KLIPPY_VER"; MISMATCH=1; }
done <<< "$AFTER" done <<< "$AFTER"
fi
if tail -n 200 "$KLIPPY_LOG" 2>/dev/null | grep -E "Command format mismatch|Protocol error|Lost communication" | tail -5 | grep .; then # Только строки после последнего старта klippy, чтобы не ловить старые ошибки
if tac "$KLIPPY_LOG" 2>/dev/null | sed '/^Start printer at/q' | grep -E "Command format mismatch|Protocol error|Lost communication" | tail -5 | grep .; then
echo "!!! В klippy.log есть ошибки протокола (см. выше)"; MISMATCH=1 echo "!!! В klippy.log есть ошибки протокола (см. выше)"; MISMATCH=1
fi fi
+112
View File
@@ -0,0 +1,112 @@
[server]
host: 0.0.0.0
port: 7125
klippy_uds_address: /home/biqu/printer_data/comms/klippy.sock
[authorization]
trusted_clients:
192.168.0.0/16
10.0.0.0/8
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.168.0.0/16
FC00::/7
FE80::/10
::1/128
cors_domains:
*.lan
*.local
*://localhost
*://localhost:*
*://my.mainsail.xyz
*://app.fluidd.xyz
[octoprint_compat]
[history]
[file_manager]
enable_object_processing: True
[update_manager]
channel: dev
refresh_interval: 168
[timelapse]
[update_manager mainsail]
path: /home/biqu/mainsail
repo: mainsail-crew/mainsail
channel: stable
type: web
[update_manager mainsail-config]
managed_services: klipper
origin: https://github.com/mainsail-crew/mainsail-config.git
path: /home/biqu/mainsail-config
primary_branch: master
type: git_repo
[update_manager KlipperScreen]
install_script: /home/biqu/KlipperScreen/scripts/KlipperScreen-install.sh
requirements: /home/biqu/KlipperScreen/scripts/KlipperScreen-requirements.txt
virtualenv: /home/biqu/.KlipperScreen-env
managed_services: KlipperScreen
origin: https://github.com/moggieuk/KlipperScreen-Happy-Hare-Edition.git
path: /home/biqu/KlipperScreen
type: git_repo
# Crowsnest update_manager entry
[update_manager crowsnest]
type: git_repo
path: ~/crowsnest
origin: https://github.com/mainsail-crew/crowsnest.git
managed_services: crowsnest
install_script: tools/pkglist.sh
# Sonar update_manager entry
[update_manager sonar]
type: git_repo
path: ~/sonar
origin: https://github.com/mainsail-crew/sonar.git
primary_branch: main
managed_services: sonar
system_dependencies: resources/system-dependencies.json
[update_manager timelapse]
type: git_repo
primary_branch: main
path: ~/moonraker-timelapse
origin: https://github.com/mainsail-crew/moonraker-timelapse.git
managed_services: klipper moonraker
[update_manager Klipper-Adaptive-Meshing-Purging]
type: git_repo
channel: dev
path: ~/Klipper-Adaptive-Meshing-Purging
origin: https://github.com/kyleisah/Klipper-Adaptive-Meshing-Purging.git
managed_services: klipper
primary_branch: main
[update_manager klipper_tmc_autotune]
type: git_repo
channel: dev
path: ~/klipper_tmc_autotune
origin: https://github.com/andrewmcgr/klipper_tmc_autotune.git
managed_services: klipper
primary_branch: main
install_script: install.sh
[update_manager happy-hare]
type: git_repo
path: ~/Happy-Hare
origin: https://github.com/moggieuk/Happy-Hare.git
primary_branch: main
managed_services: klipper
[mmu_server]
enable_file_preprocessor: True
enable_toolchange_next_pos: True
update_spoolman_location: True
+17
View File
@@ -0,0 +1,17 @@
#### Sonar - A WiFi Keepalive daemon
####
#### Written by Stephan Wendel aka KwadFan <me@stephanwe.de>
#### Copyright 2022
#### https://github.com/mainsail-crew/sonar
####
#### This File is distributed under GPLv3
####
[sonar]
enable: false # false to disable till next reboot (will stop again if not set to true)
debug_log: false # if set to true, sonar will log every ping with triptime and date/time
persistent_log: false # If true logs in /var/log/sonar.log, false logs to systemd
target: auto # IP Address, URL or auto as ping target
count: 3 # How often should be pinged?
interval: 60 # Ping again after X seconds
restart_threshold: 10 # If failed, restart WiFi after X seconds