initial commit; support for IIO BME280, IIO SI1145, old thinkpad smapi interface, and Cambridge local weather station
Peter Molnar hello@petermolnar.eu
Tue, 23 Oct 2018 16:25:16 +0100
5 files changed,
167 insertions(+),
0 deletions(-)
A
_functions.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash + +function humidity_to_comfort { + hum=$(echo "scale=0;$1/1" | bc) + + if [[ $hum -lt 30 ]]; then + COMFORT=2 + elif [[ $hum -lt 40 ]]; then + COMFORT=0 + elif [[ $hum -lt 60 ]]; then + COMFORT=1 + else + COMFORT=3 + fi + + echo $COMFORT +} + +function domoticz_send { + SEND="${1}" + if nc -z ${HOSTNAME} ${DOMOTICZ_PORT}; then + curl -s -H "Accept: application/json" "$SEND" >/dev/null + else + >&2 echo "domoticz can't be reaced at ${HOSTNAME} ${DOMOTICZ_PORT}" + fi +}
A
cambridge.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash + +source /usr/local/lib/collectd/_functions.sh + +HOSTNAME="${COLLECTD_HOSTNAME:-$(hostname -f)}" +INTERVAL="${COLLECTD_INTERVAL:-60}" +DOMOTICZ_PORT="${2:-8080}" +DOMOTICZ_IDX="${1:-1}" +DOMOTICZ_URL="http://${HOSTNAME}:${DOMOTICZ_PORT}/json.htm?type=command¶m=udevice&idx=${DOMOTICZ_IDX}&nvalue=0&svalue=" + +while true; do + cbg="$(wget -O- -q https://www.cl.cam.ac.uk/research/dtg/weather/current-obs.txt)" + + prefix="sensors-weather" + suffix="-cambridge" + declare -A data + data[temperature]=$(grep "Temperature" <<< "${cbg}" | awk '{print $2}') + data[humidity]=$(echo "scale=0;$(grep "Humidity" <<< "${cbg}" | awk '{print $2}')/1" | bc) + data[pressure]=$(echo "scale=2;$(grep "Pressure" <<< "${cbg}" | awk '{print $2}')/1" | bc) + + for key in "${!data[@]}"; do + echo "PUTVAL $HOSTNAME/${prefix}/${key}${suffix} interval=$INTERVAL N:${data[$key]}" + done + + domoticz_data="${data[temperature]};${data[humidity]};$(humidity_to_comfort ${data[humidity]});${data[pressure]};0" + SEND="${DOMOTICZ_URL}${domoticz_data}" + domoticz_send ${SEND} + + sleep "$INTERVAL" +done
A
iio-bme280.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash + +source /usr/local/lib/collectd/_functions.sh + +HOSTNAME="${COLLECTD_HOSTNAME:-$(hostname -f)}" +INTERVAL="${COLLECTD_INTERVAL:-60}" +DOMOTICZ_PORT="${2:-8080}" +DOMOTICZ_IDX="${1:-1}" +DOMOTICZ_URL="http://${HOSTNAME}:${DOMOTICZ_PORT}/json.htm?type=command¶m=udevice&idx=${DOMOTICZ_IDX}&nvalue=0&svalue=" + +i2cdev=$(dmesg | grep 'connected i2c-tiny-usb device' | head -n1 | sed -r 's/.*\s+i2c-([0-9]+).*/\1/') +echo "bme280 0x77" > /sys/bus/i2c/devices/i2c-${i2cdev}/new_device + +while true; do + for sensor in /sys/bus/iio/devices/iio\:device*; do + name=$(cat "${sensor}/name") + if [ "$name" != "bme280" ]; then + continue + fi + + prefix="sensors-weather" + suffix="-${name}" + declare -A data + data[temperature]=$(echo "scale=2;$(cat ${sensor}/in_temp_input)/1000" | bc ) + data[pressure]=$(echo "scale=2;$(cat ${sensor}/in_pressure_input)*10/1" | bc) + data[humidity]=$(echo "scale=0;$(cat ${sensor}/in_humidityrelative_input)/1" | bc) + + for key in "${!data[@]}"; do + echo "PUTVAL $HOSTNAME/${prefix}/${key}${suffix} interval=$INTERVAL N:${data[$key]}" + done + + domoticz_data="${data[temperature]};${data[humidity]};$(humidity_to_comfort ${data[humidity]});${data[pressure]};0" + SEND="${DOMOTICZ_URL}${domoticz_data}" + domoticz_send ${SEND} + + done + sleep "$INTERVAL" +done
A
iio-si1145.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash + +source /usr/local/lib/collectd/_functions.sh + +HOSTNAME="${COLLECTD_HOSTNAME:-$(hostname -f)}" +INTERVAL="${COLLECTD_INTERVAL:-60}" +DOMOTICZ_PORT="${2:-8080}" +DOMOTICZ_IDX="${1:-1}" +DOMOTICZ_URL="http://${HOSTNAME}:${DOMOTICZ_PORT}/json.htm?type=command¶m=udevice&idx=${DOMOTICZ_IDX}&nvalue=0&svalue=" + +i2cdev=$(dmesg | grep 'connected i2c-tiny-usb device' | head -n1 | sed -r 's/.*\s+i2c-([0-9]+).*/\1/') +echo "si1145 0x60" > /sys/bus/i2c/devices/i2c-${i2cdev}/new_device + +while true; do + for sensor in /sys/bus/iio/devices/iio\:device*; do + name=$(cat "${sensor}/name") + if [ "$name" != "si1145" ]; then + continue + fi + + prefix="sensors-weather" + suffix="" + declare -A data + data[gauge-ir]=$(cat ${sensor}/in_intensity_ir_raw) + data[gauge-visible]=$(cat ${sensor}/in_intensity_raw) + data[gauge-uv]=$(cat ${sensor}/in_uvindex_raw) + + for key in "${!data[@]}"; do + echo "PUTVAL $HOSTNAME/${prefix}/${key}${suffix} interval=$INTERVAL N:${data[$key]}" + done + + done + sleep "$INTERVAL" +done
A
thinkpad.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash + +source /usr/local/lib/collectd/_functions.sh + +HOSTNAME="${COLLECTD_HOSTNAME:-$(hostname -f)}" +INTERVAL="${COLLECTD_INTERVAL:-60}" +DOMOTICZ_PORT="${2:-8080}" +DOMOTICZ_IDX="${1:-1}" +DOMOTICZ_URL="http://${HOSTNAME}:${DOMOTICZ_PORT}/json.htm?type=command¶m=udevice&idx=${DOMOTICZ_IDX}&nvalue=0&svalue=" + +while true; do + ac="$(cat /sys/devices/platform/smapi/ac_connected)" + for battery in /sys/devices/platform/smapi/BAT*; do + + if [ $(cat "${battery}/installed") -eq 0 ]; then + continue + fi + + prefix="thinkpad-$(basename $battery | tr '[:upper:]' '[:lower:]')" + suffix="" + declare -A data + data[gauge-ac_connected]=${ac} + data[capacity-capacity]=$(echo "scale=2;$(cat ${battery}/remaining_capacity)/1000" | bc) + data[capacity-last_full_capacity]=$(echo "scale=2;$(cat ${battery}/remaining_capacity)/1000" | bc) + data[count-cycles]=$(cat ${battery}/cycle_count) + data[percent-percent]=$(cat ${battery}/remaining_percent) + data[temperature-temperature]=$(echo "scale=2;$(cat ${battery}/temperature)/1000" | bc) + data[voltage-voltage]=$(echo "scale=2;$(cat ${battery}/voltage)/1000" | bc) + data[power-power]=$(echo "scale=2;$(cat ${battery}/power_now)/1000" | bc) + data[current-current]==$(echo "scale=2;$(cat ${battery}/current_now)/1000" | bc) + + for key in "${!data[@]}"; do + echo "PUTVAL $HOSTNAME/${prefix}/${key}${suffix} interval=$INTERVAL N:${data[$key]}" + done + + done + + sleep "$INTERVAL" +done