#!/bin/bash set -eu PORT="${RELAY_PORT:-/dev/relay8}" STATE="${RELAY_STATE:-/var/lib/relay8/state}" # байт стану у вигляді двох hex-цифр die() { echo "relay8: $*" >&2; exit 1; } port_setup() { [ -c "$PORT" ] || die "немає порту $PORT (модуль підключено?)" stty -F "$PORT" 9600 cs8 -cstopb -parenb -crtscts -ixon -ixoff raw -echo } send_byte() { printf "\\x$1" > "$PORT" } state_get() { if [ -r "$STATE" ]; then cat "$STATE"; else echo FF; fi } state_put() { mkdir -p "$(dirname "$STATE")" printf '%s\n' "$1" > "$STATE.tmp" && mv "$STATE.tmp" "$STATE" } relay_bit() { echo $(( 8 - $1 )); } cmd="${1:-}" case "$cmd" in init) port_setup send_byte 50 # «привітання»: модуль відповідає своїм кодом (ICSE014A — AC) sleep 0.5 send_byte 51 # після цього модуль сприймає байти як стан реле sleep 0.2 send_byte "$(state_get)" ;; on|off) n="${2:-}" [[ "$n" =~ ^[1-8]$ ]] || die "номер реле — від 1 до 8" port_setup cur=$(( 16#$(state_get) )) bit=$(relay_bit "$n") if [ "$cmd" = on ]; then new=$(( cur & ~(1 << bit) & 0xFF )); else new=$(( cur | (1 << bit) )); fi hex=$(printf '%02X' "$new") send_byte "$hex" state_put "$hex" ;; all-off) port_setup send_byte FF state_put FF ;; status) cur=$(( 16#$(state_get) )) for n in 1 2 3 4 5 6 7 8; do bit=$(relay_bit "$n") if (( (cur >> bit) & 1 )); then s="без напруги"; else s="ПІД НАПРУГОЮ"; fi echo "реле $n: $s" done ;; *) sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//' exit 1 ;; esac