Автор Гілка: Скрипт нагадувача про передачу показників лічильників (to Share)  (Прочитано 6671 раз)

Відсутній Бджоляр

  • Новачок
  • *
  • дописів: 18
  • Карма: +0/-0
# apt install zenity sqlite3 sqlitebrowser

~/.bin/meters_data/cron_1_hour.bash
Код: Bash
  1. #!/bin/bash
  2.  
  3. # Скрипт нагадує, що треба передати показники лічильників воды, ґаза, електро.
  4.  
  5. email=
  6. sound="/usr/share/sounds/ubuntu/notifications/Rhodes.ogg"
  7.  
  8. dbfile=database.sqlite3
  9.  
  10. cd $(dirname $0)
  11.  
  12. declare meters_data
  13. declare -a array_data
  14. declare per_month
  15.  
  16. day_of_week=$(date +%u) # День тижня 1..7
  17.  
  18. day_of_month=$(date +%e) # День місяця 1..31
  19. month=$(date +%m)
  20. month=${month##+(0)} # Місяць 1..12
  21. year=$(date +%Y)
  22.  
  23. datetext="${day_of_month}.${month}.${year}" # ЧЧ.ММ.РРРР
  24.  
  25. [ $day_of_week -eq 6 -o $day_of_week -eq 7 ] && exit 0 # Якщо Sat чи Sun, то одразу вихід.
  26.  
  27. function get_input_data {
  28.     text=$(echo "SELECT action FROM actions WHERE id=$1" | sqlite3 $dbfile)
  29.  
  30.     meters_data=$(/usr/bin/zenity --title "Сьогодні ${day_of_month} число" --entry --text "$text" 2>/dev/null)
  31. }
  32.  
  33. actions=$(echo "SELECT action_id FROM day_action WHERE day=${day_of_month} ORDER BY action_id" | sqlite3 $dbfile)
  34.  
  35. for action in $actions ; do
  36.     DBR=$(echo "SELECT datetext, metersdata FROM fulfilled \
  37.            WHERE action=$action ORDER BY dateunix DESC" | sqlite3 $dbfile)
  38.  
  39.     month_year=$(echo ${DBR%%|*} | sed -r 's/.{,2}\.//') # last date and last meters data
  40.     [ "$month_year" == ${month}.${year} ] && continue
  41.     last_meters_data=${DBR#*|} # останні показники
  42.  
  43.     [ -f "$soundfile" ] && paplay "$soundfile"
  44.  
  45.     get_input_data "$action"
  46.  
  47.     [ -z "$meters_data" ] && continue
  48.  
  49.     dateunix=`date +%s`
  50.  
  51.     echo "INSERT INTO fulfilled (action, metersdata, datetext, dateunix) \
  52.            VALUES ($action, $meters_data, '$datetext', $dateunix)" | sqlite3 $dbfile
  53.  
  54.     [ -z "$email" ] && continue # якщо email вказано, на нього буде відправлен звіт
  55.  
  56.     DBR=$(echo "SELECT mail_subject, mail_body FROM actions WHERE id=$action" | sqlite3 $dbfile)
  57.    
  58.     mail_subject="${DBR%%|*}"
  59.     mail_body="${DBR#*|}"
  60.  
  61.     let "per_month = meters_data - last_meters_data"
  62.  
  63.     # Шаблонізатор тексту листа
  64.     mail_body=$(echo "${mail_body}" | sed "s/METERS_DATA/${meters_data}/") # поточні покази
  65.     mail_body=$(echo "${mail_body}" | sed "s/TIME/`date +%H:%M`/") # час
  66.     mail_body=$(echo "${mail_body}" | sed "s/LAST_METERS_DATA/${last_meters_data}/") # попередні покази
  67.     mail_body=$(echo "${mail_body}" | sed "s/PER_MONTH/${per_month}/") # використано за місяць
  68.  
  69.     echo "${mail_body}" | mail -s "${mail_subject}" ${email}
  70. done

~/.bin/meters_data/database.sqlite3
(from attachment archive)

Налаштувати cron:

Код: Bash
  1. 0   *   *   *   *   DISPLAY=:0 /home/username/.bin/meters_data/cron_1_hour.bash > /dev/null
  2. #                   Щогодинна перевірка (та нагадування, якщо не передали)

Продивитися базу:
Код: SQL
  1. SELECT a.mail_subject, f.metersdata, f.datetext
  2. FROM actions AS a, fulfilled AS f
  3. WHERE f.action=a.id;

Числа, по котрим треба передавати показники у таблиці day_action, де
day - число
action: 1 - газ, 2 - вода, ... дивись таблицю action.

Користуйтеся. Будуть питання - запитуйте.
Якщо хто допише саму передачу показників на сайти (у bin краще), буду вдячний.

С Повагою.