sonoff

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
sonoff [04.12.2020 19:43] – [Falshing Tasmota Firmware] Pascal Sutersonoff [07.09.2021 05:52] (current) – [Making the installation permanent] Pascal Suter
Line 205: Line 205:
  
 copy the ''mqtt-dss-bridge'' ''config.js'' file to ''/usr/local/lib/node_modules/mqtt-dss-bridge/config.js''  copy the ''mqtt-dss-bridge'' ''config.js'' file to ''/usr/local/lib/node_modules/mqtt-dss-bridge/config.js'' 
 +
 +It happened a couple of times, that the  mqtt-dss-bridge process was running without actually updating the state of the dss target. this happened after some network issues for example. since the mqtt-dss-bridge process did not exit but rather continued to run and just do nothing, systemd did not notice any problem and did not restart the service. for that reason I created a little wrapper script which checks the age of the last status update and exits with exit code 1 if that state is older than 10 seconds for longer than 10 seconds (it usually takes a couple of seconds upon starting the gateway to catch up, hence we wait 10 addiitonal seconds before killing mqtt-dss-bridge and exiting with an error state) 
 +
 +This wrapper also mutes the output of mqtt-dss-bridge which otherwise floods your syslog. 
 +
 +save this script to a convenient location such as ''/usr/local/bin/mqtt-dss-bridge.sh'' 
 +<code bash /usr/local/bin/mqtt-dss-bridge.sh>
 +#!/bin/bash
 +
 +# start the bridge in the background 
 +/usr/bin/node /usr/local/lib/node_modules/mqtt-dss-bridge/index.js > /dev/null 2>&1 &
 +PID=$!
 +echo "DSS Bridge started with PID $PID"
 +# start a loop to monitor the status every second
 +errcntr=0
 +lastUpdate=999
 +while true; do 
 +    lastUpdate=$(( \
 +            $(date +%s)\
 +            -\
 +            $(date -d "$(\
 +                mosquitto_sub -h localhost -u sonoffs -P sonoff -t dss/state/lastDiscovered -C 1 | \
 +                sed -E -e 's/"([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2}).*$/\1 \2Z/'\
 +            )" +%s)\
 +        ))
 +    if [ 10 -lt $lastUpdate ]; then 
 +            if [ $errcntr -lt 10 ]; then
 +                let errcntr++
 +                echo "DSS Bridge state is too old (last updated $lastUpdate seconds ago, max 10 allowed). This was failure $errcntr out of 10 accepted failures" 
 +            else 
 +                echo "DSS bridge state is still too old ($lastUpdate seconds) after 10 retries. killing mqtt-dss-bridge (pid $PID) and exit with error status 1"
 +                kill $PID
 +                exit 1
 +            fi
 + fi
 +    sleep 1
 +done
 +</code>
  
 create the startup service file for ''mqtt-dss-bridge'':  create the startup service file for ''mqtt-dss-bridge'': 
Line 211: Line 249:
 [Unit] [Unit]
 Description=Node.js MQTT DSS Bridge Description=Node.js MQTT DSS Bridge
-Requires=mosquitto.service       # starts mosquitto first when this service is started manually +Requires the mosquitto service to run first 
-After=mosquitto.service       # starts this after mosquitto on boot+Requires=After=mosquitto.service
  
 [Service] [Service]
-ExecStart=/usr/bin/node /usr/local/lib/node_modules/mqtt-dss-bridge/index.js+#ExecStartPre=/bin/sleep 60 
 +ExecStart=/usr/local/bin/mqtt-dss-bridge.sh
 # Required on some systems # Required on some systems
 #WorkingDirectory=/usr/local/lib/node_modules/mqtt-dss-bridge/ #WorkingDirectory=/usr/local/lib/node_modules/mqtt-dss-bridge/
 Restart=always Restart=always
- # Restart service after 10 seconds if node service crashes+ # Restart service after 10 seconds if wrapper exits with code > 0
 RestartSec=10 RestartSec=10
  # Output to syslog  # Output to syslog
  • sonoff.txt
  • Last modified: 07.09.2021 05:52
  • by Pascal Suter