wmbusmeters/ha-addon/mqtt_discovery.sh

100 wiersze
3.8 KiB
Bash
Executable File

#!/usr/bin/with-contenv bashio
aryDiscTopic=()
pub_args=()
while getopts h:p:u:P:c:w: flag
do
case "${flag}" in
h|p|u|P) pub_args+=("-${flag}" ${OPTARG});;
c) CONFIG_PATH=${OPTARG};;
w) CONFIG_DATA_PATH=${OPTARG};;
esac
done
# Get discovery_prefix
if bashio::config.exists "mqtt.discovery_prefix"
then MQTT_DISCOVERY_PREFIX=$(bashio::config "mqtt.discovery_prefix")
else MQTT_DISCOVERY_PREFIX=$(bashio::services mqtt "discovery_prefix"); fi
if [ "${MQTT_DISCOVERY_PREFIX+true}" ] || [ $MQTT_DISCOVERY_PREFIX != "null" ];
then MQTT_DISCOVERY_PREFIX="homeassistant"; fi
# Is MQTT discovery enabled?
CONFIG_MQTTDISCOVERY_ENABLED="$(jq --raw-output -c -M '.enable_mqtt_discovery' $CONFIG_PATH)"
if [ $CONFIG_MQTTDISCOVERY_ENABLED == "true" ]; then
echo -e "\nMQTT Discovery ..."
# Copy template files
templatedir="$(mktemp -d -p /dev/shm/)"
wget -O - https://github.com/weetmuts/wmbusmeters/archive/refs/heads/master.tar.gz 2> /dev/null | tar xz --strip=3 "wmbusmeters-master/ha-addon/mqtt_discovery" -C $templatedir || true
[ ! -d $CONFIG_DATA_PATH/etc/mqtt_discovery ] && mkdir -p $CONFIG_DATA_PATH/etc/mqtt_discovery
cp -u ${templatedir}/* ${CONFIG_DATA_PATH}/etc/mqtt_discovery/ 2>/dev/null || true
rm -r $templatedir
# Enumerate defined meters
IFS=$'\n'
for meter in $(jq -c -M '.meters[]' $CONFIG_PATH)
do
declare -A aryKV
declare kv
for line in $(printf '%s\n' $meter | jq --raw-output -c -M '.')
do
aryKV["name"]=$(printf '%s\n' $meter | jq --raw-output -c -M '.name')
aryKV["id"]=$(printf '%s\n' $meter | jq --raw-output -c -M '.id')
aryKV["driver"]=$(printf '%s\n' $meter | jq --raw-output -c -M '.driver')
done
echo " Adding meter: ${aryKV['name']} ..."
if [ "${aryKV['id']+true}" ] && [ "${aryKV['driver']+true}" ] ; then
file="$CONFIG_DATA_PATH/etc/mqtt_discovery/${aryKV['driver']}.json"
if test -f "$file"; then
for attribute in $(jq --raw-output -c -M '. | keys[]' $file)
do
#echo "Attribute: ${attribute}"
aryKV["attribute"]=$attribute
filter=".${attribute}.component"
component=$(jq --raw-output -c -M $filter $file)
if [[ ! -z "$component" ]] && [ $component != "null" ] ; then
topic="$MQTT_DISCOVERY_PREFIX/$component/wmbusmeters/${aryKV['id']}_$attribute/config"
filter=".${attribute}.discovery_payload"
payload=$(jq --raw-output -c -M $filter $file)
for key in ${!aryKV[@]}; do
payload="${payload//\{$key\}/${aryKV[${key}]}}"
#echo ${key} ${aryKV[${key}]}
done
echo " Add/update topic: $topic"
#echo " Payload: $payload"
aryDiscTopic+=($topic)
/usr/bin/mosquitto_pub ${pub_args[@]} -r -t "${topic}" -m "${payload}"
fi
done
else
echo " File $file not found."
fi
fi
done
fi
echo -e "MQTT Discovery cleanup..."
ramtmp="$(mktemp -p /dev/shm/)"
/usr/bin/mosquitto_sub ${pub_args[@]} -t "$MQTT_DISCOVERY_PREFIX/+/wmbusmeters/+/config" --retained-only -F "%t" > $ramtmp & PID=$!
sleep 1
kill $PID
readarray -t aryReadTopic < $ramtmp;
rm $ramtmp
for topic in ${aryReadTopic[@]}
do
if [[ ! ${aryDiscTopic[@]} =~ $topic ]]; then
echo " Removing topic: $topic"
/usr/bin/mosquitto_pub ${pub_args[@]} -r -t "${topic}" -n
fi
done