X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=bin%2Fkhatus_monitor_energy;fp=bin%2Fkhatus_monitor_energy;h=a295e3ed7a1937da536d0ba6300d809f044e16fd;hb=75b23ff8a814c76a4fa0fa12a40e6a929beec695;hp=0000000000000000000000000000000000000000;hpb=7a2b16ba7175f07e0ae54e0527475c75e8cc1210;p=khatus.git diff --git a/bin/khatus_monitor_energy b/bin/khatus_monitor_energy new file mode 100755 index 0000000..a295e3e --- /dev/null +++ b/bin/khatus_monitor_energy @@ -0,0 +1,98 @@ +#! /usr/bin/awk -f + +BEGIN { + FS = msg_fs ? msg_fs : "|" + OFS = msg_fs ? msg_fs : "|" + Kfs = key_fs ? key_fs : ":" + + bat_alert_spec[100] = "low|Energy_Bellow_Full|Must have perfection!" + bat_alert_spec[50] = "low|Energy_Bellow_Half|Where is the charger?" + bat_alert_spec[20] = "med|Energy_Low|Get the charger." + bat_alert_spec[15] = "med|Energy_Low|Get the charger!" + bat_alert_spec[10] = "hi|Energy_Low|Plug it in, ASAP!" + bat_alert_spec[5] = "hi|Energy_CRITICALLY_Low|CHARGE NOW!!! GO GO GO!!!" +} + +$1 == "OK" && \ +$2 == "khatus_sensor_energy" && \ +$3 == "line_power" { + line_power_prev = line_power_curr + line_power_curr = $4 + if (line_power_curr == "no" && line_power_prev != "no") { + alert("low", "PowerUnplugged", "") + } +} + +$1 == "OK" && \ +$2 == "khatus_sensor_energy" && \ +$3 == "battery_state" { + battery_state_prev = battery_state_curr + battery_state_curr = $4 + printf("BATTERY_STATE prev:%s curr:%s\n", battery_state_prev, battery_state_curr) +} + +$1 == "OK" && \ +$2 == "khatus_sensor_energy" && \ +$3 == "battery_percentage" { + battery_percentage = ensure_numeric($4) + printf("BATTERY_PERCENTAGE %s\n", battery_percentage) + if (battery_state_curr == "discharging") { + for (threshold in bat_alert_spec) { + threshold = ensure_numeric(threshold) + if (battery_percentage <= threshold && !alerted[threshold]) { + split(bat_alert_spec[threshold], msg, "|") + priority = msg[1] + subject = msg[2] + body = sprintf("%d%% %s", battery_percentage, msg[3]) + alert(priority, subject, body) + alerted[threshold]++ + } + } + } else { + delete alerted + } +} + +# After peeking, let everything pass through! +// + +function alert(priority, subject, body) { + # priority : "low" | "med" | "hi" + # subject : no spaces + # body : anything + print("OK", "khatus_monitor_energy", "alert", priority, subject, body) +} + +function ensure_numeric(n) { + return n + 0 +} + +#------------------------------- +# Why do we need ensure_numeric? +#------------------------------- +# awk appears to be guessing the type of an inputted scalar based on usage, so +# if we read-in a number, but did not use it in any numeric operations, but did +# use as a string (even in just a format string!) - it will be treated as a +# string and can lead to REALLY SURPRISING behavior in conditional statements, +# where smaller number may compare as greater than the bigger ones, such as. +# +# Demo: +# +# $ awk 'BEGIN {x = "75"; y = "100"; sprintf("x: %d, y: %d\n", x, y); if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# $ awk 'BEGIN {x = "75"; y = "100"; sprintf("x: %s, y: %d\n", x, y); if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 > 100 + +# However, once used as a number, seems to stay that way even after being +# used as string: +# +# $ awk 'BEGIN {x = "75"; y = "100"; x + y; sprintf("x: %s, y: %d\n", x, y); if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# +# $ awk 'BEGIN {x = "75"; y = "100"; x + y; sprintf("x: %s, y: %d\n", x, y); z = x y; if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# +# $ awk 'BEGIN {x = "75"; y = "100"; x + y; z = x y; if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 < 100 +# $ awk 'BEGIN {x = "75"; y = "100"; z = x y; if (x > y) {print "75 > 100"} else if (x < y) {print "75 < 100"}}' +# 75 > 100