Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # Copyright (C) 2016-2019 Aleksander Morgado <aleksander@aleksander.es>
- # Used Aleksander's orginal code for base of this script
- # sends modem data to mqtt server
- # install mqtt client: opkg install mosquitto-client
- # copy to this file to: /etc/config/
- # chmod +x /etc/config/modem_mqtt.sh
- # in /etc/rc.local add:
- # sleep 60
- # /etc/config/modem_mqtt.sh &
- # before exit 0
- #Home Assistant MQTT server
- MQTTSERVER=odroid
- #MQTT port, default is 1883
- PORT=1883
- #change device to your modem device number
- device="0"
- [ -x /usr/bin/mmcli ] || exit 0
- [ -x /usr/sbin/pppd ] || exit 0
- # [ -n "$INCLUDE_ONLY" ] || {
- # . /lib/functions.sh
- # . ../netifd-proto.sh
- # . ./ppp.sh
- # init_proto "$@"
- # }
- cdr2mask ()
- {
- # Number of args to shift, 255..255, first non-255 byte, zeroes
- set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
- if [ "$1" -gt 1 ]
- then
- shift "$1"
- else
- shift
- fi
- echo "${1-0}"."${2-0}"."${3-0}"."${4-0}"
- }
- # This method expects as first argument a list of key-value pairs, as returned by mmcli --output-keyvalue
- # The second argument must be exactly the name of the field to read
- #
- # Sample output:
- # $ mmcli -m 0 -K
- # modem.dbus-path : /org/freedesktop/ModemManager1/Modem/0
- # modem.generic.device-identifier : ed6eff2e3e0f90463da1c2a755b2acacd1335752
- # modem.generic.manufacturer : Dell Inc.
- # modem.generic.model : DW5821e Snapdragon X20 LTE
- # modem.generic.revision : T77W968.F1.0.0.4.0.GC.009\n026
- # modem.generic.carrier-configuration : GCF
- # modem.generic.carrier-configuration-revision : 08E00009
- # modem.generic.hardware-revision : DW5821e Snapdragon X20 LTE
- # ....
- modemmanager_get_field() {
- local list=$1
- local field=$2
- local value=""
- [ -z "${list}" ] || [ -z "${field}" ] && return
- # there is always at least a whitespace after each key, and we use that as part of the
- # key matching we do (e.g. to avoid getting 'modem.generic.state-failed-reason' as a result
- # when grepping for 'modem.generic.state'.
- line=$(echo "${list}" | grep "${field} ")
- value=$(echo ${line#*:})
- # not found?
- [ -n "${value}" ] || return 2
- # only print value if set
- [ "${value}" != "--" ] && echo "${value}"
- return 0
- }
- # build a comma-separated list of values from the list
- modemmanager_get_multivalue_field() {
- local list=$1
- local field=$2
- local value=""
- local length idx item
- [ -z "${list}" ] || [ -z "${field}" ] && return
- length=$(modemmanager_get_field "${list}" "${field}.length")
- [ -n "${length}" ] || return 0
- [ "$length" -ge 1 ] || return 0
- idx=1
- while [ $idx -le "$length" ]; do
- item=$(modemmanager_get_field "${list}" "${field}.value\[$idx\]")
- [ -n "${item}" ] && [ "${item}" != "--" ] && {
- [ -n "${value}" ] && value="${value}, "
- value="${value}${item}"
- }
- idx=$((idx + 1))
- done
- # nothing built?
- [ -n "${value}" ] || return 2
- # only print value if set
- echo "${value}"
- return 0
- }
- modemstatus=$(mmcli --modem="${device}" --output-keyvalue)
- send_config_data() {
- model=$(modemmanager_get_field "${modemstatus}" "modem.generic.model" | cut -d " " -f 1-3)
- [ -n "${model}" ] && model=",\"model\":\"${model}\"" || model=""
- manufacturer=$(modemmanager_get_field "${modemstatus}" "modem.generic.manufacturer")
- [ -n "${manufacturer}" ] && manufacturer=",\"manufacturer\":\"${manufacturer}\"" || manufacturer=""
- name=$(modemmanager_get_field "${modemstatus}" "modem.generic.hardware-revision")
- [ -n "${name}" ] && name="${name}" || name=""
- #send MQTT discovery message
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/config" -m "{\
- \"name\":\"$name\"\
- ,\"state_topic\":\"modem/state\"\
- ,\"json_attributes_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:router-wireless\",\"unit_of_measurement\":\"%\",\"value_template\":\"{{ value_json.signal }}\"\
- ,\"unique_id\":\"modem_$name\"\
- }" -i "OpenWRT" -r -d
- #discover snr sensor
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/snr/config" -m "{\
- \"name\":\"snr_$name\"\
- ,\"state_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:signal\",\"unit_of_measurement\":\"dB\",\"value_template\":\"{{ value_json.lte_snr }}\"\
- ,\"unique_id\":\"snr_$name\"\
- }" -i "OpenWRT" -r
- #discover rssi sensor
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/rssi/config" -m "{\
- \"name\":\"rssi_$name\"\
- ,\"state_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:signal\",\"unit_of_measurement\":\"dBm\",\"value_template\":\"{{ value_json.lte_rssi }}\"\
- ,\"unique_id\":\"rssi_$name\"\
- }" -i "OpenWRT" -r
- #discover rsrq sensor
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/rsrq/config" -m "{\
- \"name\":\"rsrq_$name\"\
- ,\"state_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:signal\",\"unit_of_measurement\":\"dB\",\"value_template\":\"{{ value_json.lte_rsrq }}\"\
- ,\"unique_id\":\"rsrq_$name\"\
- }" -i "OpenWRT" -r
- #discover rsrp sensor
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/rsrp/config" -m "{\
- \"name\":\"rsrp_$name\"\
- ,\"state_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:signal\",\"unit_of_measurement\":\"dBm\",\"value_template\":\"{{ value_json.lte_rsrp }}\"\
- ,\"unique_id\":\"rsrp_$name\"\
- }" -i "OpenWRT" -r
- #discover inbound traffic sensor
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/rxspeed/config" -m "{\
- \"name\":\"rx_$name\"\
- ,\"state_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:download\",\"unit_of_measurement\":\"Mbps\",\"value_template\":\"{{ value_json.rx_speed }}\"\
- ,\"unique_id\":\"rx_$name\"\
- }" -i "OpenWRT" -r
- #discover outbound traffic sensor
- mosquitto_pub -h $MQTTSERVER -p $PORT -t "homeassistant/sensor/modem/txspeed/config" -m "{\
- \"name\":\"tx_$name\"\
- ,\"state_topic\":\"modem/status\"\
- ,\"icon\":\"mdi:upload\",\"unit_of_measurement\":\"Mbps\",\"value_template\":\"{{ value_json.tx_speed }}\"\
- ,\"unique_id\":\"tx_$name\"\
- }" -i "OpenWRT" -r
- }
- make_mqtt_message() {
- local lte_rssi lte_rsrq lte_rsrp lte_snr
- local ipv4address ipv6address rx_speed tx_speed
- local operator duration signal state
- local bearerpath bearerstatus
- bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]")
- bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue)
- modemsignal=$(mmcli --modem="${device}" --signal-get --output-keyvalue)
- name=$(modemmanager_get_field "${modemstatus}" "modem.generic.hardware-revision")
- [ -n "${name}" ] && name="${name}" || name=""
- model=$(modemmanager_get_field "${modemstatus}" "modem.generic.model" | cut -d " " -f 1-3)
- [ -n "${model}" ] && model=",\"model\":\"${model}\"" || model=""
- manufacturer=$(modemmanager_get_field "${modemstatus}" "modem.generic.manufacturer")
- [ -n "${manufacturer}" ] && manufacturer=",\"manufacturer\":\"${manufacturer}\"" || manufacturer=""
- operator=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-name")
- [ -n "${operator}" ] && operator=",\"operator\":\"${operator}\"" || operator=""
- state=$(modemmanager_get_field "${modemstatus}" "modem.generic.state")
- [ -n "${state}" ] && state=",\"state\":\"${state}\"" || state=""
- duration=$(modemmanager_get_field "${bearerstatus}" "bearer.stats.duration")
- [ -n "${duration}" ] && duration=",\"duration\":\"${duration}\"" || duration=""
- signal=$(modemmanager_get_field "${modemstatus}" "modem.generic.signal-quality.value")
- [ -n "${signal}" ] && signal="${signal}" || signal=""
- lte_rssi=$(modemmanager_get_field "${modemsignal}" "modem.signal.lte.rssi")
- [ -n "${lte_rssi}" ] && lte_rssi=",\"lte_rssi\":${lte_rssi}" || lte_rssi=""
- lte_rsrq=$(modemmanager_get_field "${modemsignal}" "modem.signal.lte.rsrq")
- [ -n "${lte_rsrq}" ] && lte_rsrq=",\"lte_rsrq\":${lte_rsrq}" || lte_rsrq=""
- lte_rsrp=$(modemmanager_get_field "${modemsignal}" "modem.signal.lte.rsrp")
- [ -n "${lte_rsrp}" ] && lte_rsrp=",\"lte_rsrp\":${lte_rsrp}" || lte_rsrp=""
- lte_snr=$(modemmanager_get_field "${modemsignal}" "modem.signal.lte.snr")
- [ -n "${lte_snr}" ] && lte_snr=",\"lte_snr\":${lte_snr}" || lte_snr=""
- ipv4address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address")
- [ -n "${ipv4address}" ] && ipv4address=",\"ipv4 address\":\"${ipv4address}\"" || ipv4address=""
- ipv6address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address")
- [ -n "${ipv6address}" ] && ipv6address=",\"ipv6 address\":\"${ipv6address}\"" || ipv6address=""
- #calculating current download speed
- [ -n "${rxbytes}" ] && rxbyteslast=$rxbytes
- rxbytes="$(ifconfig wwan0 | grep "RX bytes:" | sed 's/bytes://g' | awk '{print $2}') $(date +%s)"
- [ -n "${rxbyteslast}" ] && rx_speed=$(echo $rxbytes $rxbyteslast | awk '{printf "%.2f\n",(($1-$3)/($2-$4)*8)/1024/1024}')
- [ -n "${rx_speed}" ] && rx_speed=",\"rx_speed\":${rx_speed}" || rx_speed=""
- #calculating current upload speed
- [ -n "${txbytes}" ] && txbyteslast=$txbytes
- txbytes="$(ifconfig wwan0 | grep "TX bytes:" | sed 's/bytes://g' | awk '{for(i=1;i<=NF;i++)if($i~/TX/)print $(i+1)}') $(date +%s)"
- [ -n "${txbyteslast}" ] && tx_speed=$(echo $txbytes $txbyteslast | awk '{printf "%.2f\n",(($1-$3)/($2-$4)*8)/1024/1024}')
- [ -n "${tx_speed}" ] && tx_speed=",\"tx_speed\":${tx_speed}" || tx_speed=""
- mosquitto_pub -h $MQTTSERVER -t modem/status -m "{\
- \"name\":\"$name\"\
- $model\
- $manufacturer\
- $operator\
- $state\
- $duration\
- ,\"signal\":$signal\
- $lte_snr\
- $lte_rssi\
- $lte_rsrq\
- $lte_rsrp\
- $ipv4address\
- $ipv6address\
- $rx_speed\
- $tx_speed\
- }" -i "OpenWRT"
- mosquitto_pub -h $MQTTSERVER -t modem/state -m "{\"signal\":$signal}" -i "OpenWRT"
- }
- #wait that ModemManager process has started
- while ! pgrep -f "ModemManager" > /dev/null; do
- sleep 30
- done
- #wait that modem is found in ModemManager
- while [[ "${name}" == "" ]]
- do
- name=$(modemmanager_get_field "${modemstatus}" "modem.generic.hardware-revision")
- sleep 10
- done
- #sending config data to Home Assistant for autodiscovery
- [ -n "${name}" ] && send_config_data
- resendconf=0
- while true;do
- [ -n "${name}" ] && make_mqtt_message
- resendconf=$((resendconf+1))
- #resend config message every 15 minutes for in case that mqtt server has been down
- if [[ $resendconf == 30 ]]; then
- [ -n "${name}" ] && send_config_data
- resendconf=0
- fi
- sleep 29
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement