Skip to content

Instantly share code, notes, and snippets.

@jannickfahlbusch
Created August 21, 2023 09:06
Show Gist options
  • Select an option

  • Save jannickfahlbusch/f623dd8f056d03d0517e182cd493e81b to your computer and use it in GitHub Desktop.

Select an option

Save jannickfahlbusch/f623dd8f056d03d0517e182cd493e81b to your computer and use it in GitHub Desktop.
HomeAssistant MQTT Autodiscovery for wmbusmeters
#!/usb/bin/env bash
# Required variables
MQTT_HOST="" # Your mqtt host
MQTT_USERNAME="" # Your mqtt username
MQTT_PASSWORD="" # Your mqtt password
METERS_FILES="" # Location of wmbusmeters.d directory
MQTT_DISCOVERY_PREFIX="homeassistant"
tmpdir="$(mktemp -d)"
echo "Using temporary folder $tmpdir for all files"
get_template_files() {
wget -O $tmpdir/main.zip https://github.com/wmbusmeters/wmbusmeters-ha-addon/archive/refs/heads/main.zip 2> /dev/null
unzip $tmpdir/main.zip -d $tmpdir
}
read_properties() {
file="$1"
while IFS="=" read -r key value; do
case "$key" in
"name") name="$value" ;;
"id") id="$value" ;;
"driver") driver="$value" ;;
esac
done < "$file"
}
submit_autodiscovery() {
local name=$1
local driver=$2
local id=$3
file="$tmpdir/wmbusmeters-ha-addon-main/wmbusmeters-ha-addon-edge/mqtt_discovery/${driver}.json"
if test -f "$file"; then
for attribute in $(jq --raw-output -c -M '. | keys[]' $file)
do
filter=".${attribute}.component"
component=$(jq --raw-output -c -M $filter $file)
if [[ ! -z "$component" ]] && [ $component != "null" ] ; then
topic="$MQTT_DISCOVERY_PREFIX/$component/wmbusmeters/${id}_$attribute/config"
filter=".${attribute}.discovery_payload"
payload=$(jq --raw-output -c -M $filter $file)
payload="${payload//\{attribute\}/${attribute}}"
payload="${payload//\{name\}/${name}}"
payload="${payload//\{id\}/${id}}"
payload="${payload//\{driver\}/${driver}}"
echo " Add/update topic: $topic"
mosquitto_pub -h $MQTT_HOST -u $MQTT_USERNAME -P $MQTT_PASSWORD -r -t "${topic}" -m "${payload}"
echo $payload
fi
done
else
echo "Autodiscovery file for driver $driver not found."
fi
}
parse_meters() {
for meter in $METERS_FILES/*; do
read_properties $meter
echo "Adding Autodiscovery for meter ${name} with driver ${driver}"
submit_autodiscovery $name $driver $id
done
}
get_template_files
parse_meters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment