sonoff Geräte mit espurna- oder tasmota-Firmware auf CCU2

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Antworten
frodo.
Beiträge: 7
Registriert: 06.07.2016, 15:13

sonoff Geräte mit espurna- oder tasmota-Firmware auf CCU2

Beitrag von frodo. » 17.05.2018, 16:41

Vorab, da ich nach längerer Suche nichts gefunden habe was eine Einbindung von sonoff Geräten mit Status Rückmeldung beschrieben hätte, habe ich mich kurzerhand dazu entschlossen ein Skript hierfür zuschreiben. Leider funktioniert die Parameter Übergabe an curl ohne Skript nicht besonders schön und eine Status Meldung ob der Schalter an oder aus ist lässt sich so einfach auch nicht bewerkstelligen (zu viele Sonderzeichen). Als Vorlage habe ich mir die Fritzbox Skripte (https://hausautomatisierung.rainer-grun ... u-steuern/) herangezogen welche ebenfalls den Status ermitteln und auch Temperartur und Leistung anzeigen.
Die Leistungsanzeige habe ich aktuell nicht implementiert.

Bisher kann mein Skript Sonoff Basic und Sonoff TH10 an steuern, andere Hardware hatte ich nicht zum testen.

Als Vorraussetzung sollte auf den Sonoff Geräten die Firmware von https://github.com/xoseperez/espurna/wiki installiert sein, ausserdem muß dort die HTTP API aktiviert sein.
Wie das geht steht unter https://github.com/xoseperez/espurna/wiki/RESTAPI:
espurna.jpg
Ausschnitt aus der Espurna Weboberfläche
Desweiteren wird natürlich das CUxD Addon benötigt.

Ist das alles bereits vorhanden können wir nun damit anfangen alles einzurichten.

Als erstes kopieren wir das folgende Skript auf die CCU2 nach /usr/local/addons/cuxd/user/espurna.sh:

Code: Alles auswählen

#!/bin/sh
# set -x

# Version: 0.2
# Date:    2018-05-17
# Changelog:
#	small fixes, for wrong apikey

# More Detail and how you enable espurna restapi:
# https://github.com/xoseperez/espurna/wiki/RESTAPI

FUNC=$1
CHANNEL=$2
IPADDR=$3
APIKEY=$4
VALUE=$5

HOMEMATIC="127.0.0.1"
AVAILABLE=2 # Status: unbekannt
DEBUG=0

CURL=/usr/bin/curl
CURL_timout='-m 5'


set_CCU_SysVar(){
	Debugmsg1=$Debugmsg1"set_CCU_SysVar: \n\t\tValue: $1\n\t\tCCU-System-Variable: $2\n"
        if [ "$1" != "" ]; then
                Debugmsg1=$Debugmsg1"\t\thttp://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27$2%27%29.State%28%22$1%22%29 \n"
                TEST=$(${CURL} -s $CURL_timout "http://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27$2%27%29.State%28%22$1%22%29")
        else
                Debugmsg1=$Debugmsg1"\t\t$IPADDR -> set_CCU_SysVar: $2 - Fehler, keine Status.\n"
                logger -i -t $0 -p 3 "$IPADDR -> set_CCU_SysVar: $2 - Fehler, keine Status."
        fi
}

set_CUxD_state(){
	Debugmsg1=$Debugmsg1"set_CUxD_state: \n\t\tValue: $1\n\t\tCUX-CHANNEL: $2\n"
        if [ "$1" != "" ]; then
                Debugmsg1=$Debugmsg1"\t\thttp://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27CUxD.$2.SET_STATE%27%29.State%28%22$1%22%29 \n"
                TEST=$(${CURL} -s $CURL_timout "http://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27CUxD.$2.SET_STATE%27%29.State%28%22$1%22%29")
        else
                Debugmsg1=$Debugmsg1"\t\t$IPADDR -> set_CUxD_state: $2 - Fehler, keine Status.\n"
                logger -i -t $0 -p 3 "$IPADDR -> set_CUxD_state: $2 - Fehler, keine Status."
        fi
}

checkDevice(){
	TEST=$(ping -c 1 -w 1 $1)
	if [ $? -eq 0 ]
	then
		AVAILABLE=1 # Status: erreichbar
		STATE=$(${CURL} -s $CURL_timout "http://${IPADDR}/apis?apikey=${APIKEY}" | grep api)
		if [ $? -eq 0 ]
		then
			AVAILABLE=1 # Status: erreichbar
		else
			AVAILABLE=0 # Status: nicht erreichbar
		fi
	else
		AVAILABLE=0 # Status: nicht erreichbar
	fi
}

func_switch(){
	if [ $AVAILABLE -ge 1 ] ; then
		Debugmsg1=$Debugmsg1"func:   \t\t$1\ncmd: \t\t${CURL} -s $CURL_timout \"http://${IPADDR}/api/relay/0?apikey=${APIKEY}&value=${VALUE}\" \n"
		TEST=$(${CURL} -s $CURL_timout "http://${IPADDR}/api/relay/0?apikey=${APIKEY}&value=${VALUE}")
		STATE=$(${CURL} -s $CURL_timout "http://${IPADDR}/api/relay/0?apikey=${APIKEY}")
		echo -e "\tswitch[0|1]: ${STATE}"
		set_CUxD_state $STATE $CHANNEL
	fi
	echo -e "\tavailable: $AVAILABLE"
	set_CCU_SysVar $AVAILABLE $CHANNEL-status
}

func_switch_temperature(){
	STATE=0
	if [ $AVAILABLE -ge 1 ] ; then
		Debugmsg1=$Debugmsg1"func:   \t\t$1\ncmd: \t\t${CURL} -s $CURL_timout \"http://${IPADDR}/api/temperature?apikey=${APIKEY}\" \n"
		STATE=$(${CURL} -s $CURL_timout "http://${IPADDR}/api/temperature?apikey=${APIKEY}")
		echo -e "\ttemperature: $STATE"
		set_CCU_SysVar $STATE $CHANNEL-temperature
	fi
}

func_switch_humidity(){
	STATE=0
	if [ $AVAILABLE -ge 1 ] ; then
		Debugmsg1=$Debugmsg1"func:   \t\t$1\ncmd: \t\t${CURL} -s $CURL_timout \"http://${IPADDR}/api/humidity?apikey=${APIKEY}\" \n"
		STATE=$(${CURL} -s $CURL_timout "http://${IPADDR}/api/humidity?apikey=${APIKEY}")
		echo -e "\thumidity: $STATE"
		set_CCU_SysVar $STATE $CHANNEL-humidity
	fi
}

if [ $DEBUG -eq 1 ] ; then
	Debugmsg1=$Debugmsg1"$(basename $0) $1 $CHANNEL $IPADDR $APIKEY $VALUE \n\n" 
	Debugmsg1=$Debugmsg1"channel: \t$CHANNEL\n"
	Debugmsg1=$Debugmsg1"IP-Addr: \t$IPADDR\n"
	Debugmsg1=$Debugmsg1"API-Key: \t$APIKEY\n"
	Debugmsg1=$Debugmsg1"Value:\t\t$VALUE\n\n"
fi


case $1 in
        "switch")
		checkDevice $IPADDR
		func_switch $1
		;;
	"switch-t")
		checkDevice $IPADDR
		func_switch $1
		func_switch_temperature $1
		;;
	"switch-th")
		checkDevice $IPADDR
		func_switch $1
		func_switch_temperature $1
		func_switch_humidity $1
		;;
	"status")
		checkDevice $IPADDR
		if [ $AVAILABLE -ge 1 ] ; then
			Debugmsg1=$Debugmsg1"func:   \t\t$1\ncmd: \t\t${CURL} -s $CURL_timout \"http://${IPADDR}/apis?apikey=${APIKEY}\" \n"
			TEST=$(${CURL} -s $CURL_timout "http://${IPADDR}/apis?apikey=${APIKEY}")
			echo $TEST
		else
			echo -e "api-key or ip-adresse are wrong"
			echo -e "couldn't connect to device\n"
		fi
		;;
	*)
		echo -e "Usage:"
		echo -e "\t $(basename $0) [switch|switch-t|switch-th] [CUX2801xxx:x] [ipaddr] [apikey] [value]\n\n"
		echo -e "Examples:"
		echo -e "\t $(basename $0) switch    CUX2801xxx:x 192.168.x.x 1234567890123456   \t # status switch"
		echo -e "\t $(basename $0) switch    CUX2801xxx:x 192.168.x.x 1234567890123456 0 \t # switch off"
		echo -e "\t $(basename $0) switch    CUX2801xxx:x 192.168.x.x 1234567890123456 1 \t # switch on"
		echo -e "\t $(basename $0) switch    CUX2801xxx:x 192.168.x.x 1234567890123456 2 \t # switch toggle on/off"
		echo -e "\t $(basename $0) switch-t  CUX2801xxx:x 192.168.x.x 1234567890123456   \t # status switch and temperature"
		echo -e "\t $(basename $0) switch-t  CUX2801xxx:x 192.168.x.x 1234567890123456 0 \t # switch off with temperature"
		echo -e "\t $(basename $0) switch-t  CUX2801xxx:x 192.168.x.x 1234567890123456 1 \t # switch on  with temperature"
		echo -e "\t $(basename $0) switch-th CUX2801xxx:x 192.168.x.x 1234567890123456   \t # status switch, temperature and humidity"
		echo -e "\t $(basename $0) switch-th CUX2801xxx:x 192.168.x.x 1234567890123456 0 \t # switch off with status temperature and humidity"
		echo -e "\t $(basename $0) switch-th CUX2801xxx:x 192.168.x.x 1234567890123456 1 \t # switch on  with status temperature and humidity"
		echo -e "\t $(basename $0) status    CUX2801xxx:x 192.168.x.x 1234567890123456   \t # espurna available restapi"
		exit 0
		;;
esac

if [ $DEBUG -eq 1 ]
then
	echo -e "\n\n"
	echo -e "-----------------------------------------------------------------------------------------------------"
	echo -e "   		               		Debug Ausgaben"
	echo -e "-----------------------------------------------------------------------------------------------------"
	echo -e $Debugmsg1
fi
exit 0
und machen das Skript ausführbar

Code: Alles auswählen

chmod +x /usr/local/addons/cuxd/user/espurna.sh
Als nächstes können wir Anfangen ein neues CUxD Device anzulegen:
cuxd.jpg
So sollte es in CUxD aussehen
cuxd.jpg (17.4 KiB) 547 mal betrachtet
CUxD Gerätetyp: (28) System
Funktion: Exec
Seriennummer: kann die Vorgabe verwendet werden.
Name: kann die Vorgabe verwendet werden, ich habe es "CUxD espurna1" genannt.
Geräte-Icon: Fernbedienung 19 Tasten
Control: Schalter

Danach "Gerät auf CCU erzeugen" drücken und auf die CCU2 Web Oberfläche wechseln.

Auf der CCU2 Oberfläche fügen wir nun ein neuers Gerät hinzu, im Posteingang sollte das soeben erstelle neue Gerät bereits angezeigt werden.
CCU2-1.jpg
CCU2-1.jpg (10.63 KiB) 538 mal betrachtet
Auf Posteingang klicken:
CCU2-2.jpg
CCU2-2.jpg (7.79 KiB) 538 mal betrachtet
Und mit "Fertig" übernehmen:
CCU2-3.jpg
CCU2-3.jpg (19.81 KiB) 538 mal betrachtet
Danach das Gerät auswählen und die Einstellungen bearbeiten:
CCU2-4.jpg
Falls das Sonoff Gerät ein Temperatur und Feuchtigkeitsfühler hat kann man dies durch ändern des Parameters "switch" ebenfalls abfragen.
  • switch = Nur Schalter
  • switch-t = Schalter und Temperatur
  • switch-th = Schalter, Temperatur und Luftfeuchtigkeit
Bei switch-t und switch-th sind zwingend Systemvariablen zu definieren.
Aktuell werden folgende drei Systemvariablen aktualisiert:
CUX28001xxx:x-status
CUX28001xxx:x-temperatur
CUX28001xxx:x-humidity

Bei mir sehen die Systemvariablen wie folgt aus:
CCU2-5.jpg
Am Beispiel eines Sonoff TH10 sieht das Gerät nun wie folgt aus:
CCU2-6.jpg
Anmerkung: Der Status ob der Schalter an oder aus ist wird auch dann in der CCU aktualisiert wenn man den Taster am Gerät drückt oder über andere Wege den Schalter betätigt als direkt mit der CCU, allerdings dauert es bis zu 60 Sekunden bis die CCU den neuen Status abfragt. Dies läßt sich über den Parameter "SWITCH|TIMER_PRESET" anpassen. Das habe ich aber nicht getestet.
Zuletzt geändert von frodo. am 20.05.2018, 11:23, insgesamt 1-mal geändert.

frodo.
Beiträge: 7
Registriert: 06.07.2016, 15:13

Re: sonoff Geräte mit espurna Firmware per CUxD steuern

Beitrag von frodo. » 19.05.2018, 00:29

Kaum nutzt man espurna bekommt man ein Gerät welches nur mit Tasmota funktioniert...

Nachdem ich mit der zusätzlichen Tasmota Integration an die Grenzen gestoßen bin habe ich das Skript mit Optionalen Parametern versehen.
Hierdurch ändert sich der Aufruf in der CCU2, da nun vor jeder Option ein Bezeichner erforderlich ist.

Bisher funktioniert bei Tasmota nur das schalten, mehr kann meine Obi Steckdose nicht :D

Das Skript habe ich bei mir nun umbenannt, aus espurna wurde sonoff.

Daraus ergibt sich in der CCU folgende Parametrisierung:

Geräteparameter:
PARAM1 /usr/local/addons/cuxd/user/sonoff.sh

Kanalparameter (espurna):
SWITCH|CMD_SHORT: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -a $_C2$ -o 0
SWITCH|CMD_LONG: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -a $_C2$ -o 1
SWITCH|CH_PARAM1: 192.168.0.34
SWITCH|CH_PARAM2 : 978CA2E6EBEEAAD0
SWITCH|TIMER_PRESET: 60
SWITCH|CMD_TIMER: $_P1$ -f switch-th -c $CHANNEL$ -i $_C1$ -a $_C2$

Kanalparameter (tasmota mit Passwort im WebIf):
SWITCH|CMD_SHORT: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -u $_C2$ -p $_C3$ -o 0
SWITCH|CMD_LONG: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -u $_C2$ -p $_C3$ -o 1
SWITCH|CH_PARAM1: 192.168.0.34
SWITCH|CH_PARAM2 : user
SWITCH|CH_PARAM3 : password
SWITCH|TIMER_PRESET: 60
SWITCH|CMD_TIMER: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -u $_C2$ -p $_C3$

Kanalparameter (tasmota ohne Passwort im WebIf):
SWITCH|CMD_SHORT: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -o 0
SWITCH|CMD_LONG: $_P1$ -f switch -c $CHANNEL$ -i $_C1$ -o 1
SWITCH|CH_PARAM1: 192.168.0.34
SWITCH|CH_PARAM2 : user
SWITCH|CH_PARAM3 : password
SWITCH|TIMER_PRESET: 60
SWITCH|CMD_TIMER: $_P1$ -f switch -c $CHANNEL$ -i $_C1$

Hier nun das neue Skript:

Code: Alles auswählen

#!/bin/sh
# set -x

# Version: 0.6
# Date:    2018-06-05
# Changelog:
#	small fixes, for wrong apikey
#	add tasmota switch for user and password use variable apikey
#	redesign with options
#	add tasmota temperature, humidity
#	add sonoff pow

# More Detail and how you enable espurna restapi:
# https://github.com/xoseperez/espurna/wiki/RESTAPI

# Test:
# ./sonoff.sh -f status -c CUX2801004:4 -i 192.168.6.131 -u admin -p bilbo01 -d
# ./sonoff.sh -f status -c CUX2801004:3 -i 192.168.6.115 -a C87129A2AD1EE170 -d
# ./sonoff.sh -f status -c CUX2801004:1 -i 192.168.6.156


usage() {
	echo -e 'usage:'
	echo -e "\t $(basename $0) -f [status|switch|switch-t|switch-th] -c CUX2801xxx:x -i ipaddr [-a apikey] [-u user] [-p password] [-o value] [-d] [-h]\n"
	echo -e '\t examples espurna firmware:'
	echo -e "\t $(basename $0) -h # this usage info"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456      # status switch"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 0 # switch off"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 1 # switch on"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 2 # switch toggle on/off"
	echo -e "\t $(basename $0) -f switch-t  -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456      # status switch and temperature"
	echo -e "\t $(basename $0) -f switch-t  -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 0 # switch off with temperature"
	echo -e "\t $(basename $0) -f switch-t  -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 1 # switch on  with temperature"
	echo -e "\t $(basename $0) -f switch-th -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456      # status switch, temperature and humidity"
	echo -e "\t $(basename $0) -f switch-th -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 0 # switch off with status temperature and humidity"
	echo -e "\t $(basename $0) -f switch-th -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456 -o 1 # switch on  with status temperature and humidity"
	echo -e "\t $(basename $0) -f status    -c CUX2801xxx:x -i 192.168.x.x -a 1234567890123456      # espurna available restapi\n"
	echo -e '\t examples tasmota firmware:'
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -u user -p password      # status switch"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -u user -p password -o 0 # switch off"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -u user -p password -o 1 # switch on"
	echo -e "\t $(basename $0) -f switch    -c CUX2801xxx:x -i 192.168.x.x -u user -p password -o 2 # switch toggle on/off"
	echo -e "\t $(basename $0) -f switch-th -c CUX2801xxx:x -i 192.168.x.x -u user -p password      # status switch, temperature and humidity"
	echo -e "\t $(basename $0) -f switch-p  -c CUX2801xxx:x -i 192.168.x.x -u user -p password      # status switch, power, volt, ampere, ..."
	echo -e "\t $(basename $0) -f status    -c CUX2801xxx:x -i 192.168.x.x -u user -p password      # tasmota status"
	exit 0
}

# A POSIX variable
OPTIND=1         # Reset in case getopts has been used previously in the shell.

# Initialize our own variables:
HOMEMATIC="127.0.0.1"
AVAILABLE=2 # Status: unbekannt
DEBUG=0
FUNC=''
CHANNEL=''
IPADDR=''
APIKEY=''
USER=''
PASSWD=''
VALUE=''


while getopts "h?df:c:i:a:u:p:o:" opt; do
    case "$opt" in
    h|\?)
        usage
        exit 0
        ;;
    f)  FUNC=$OPTARG
        ;;
    c)  CHANNEL=$OPTARG
        ;;	
    i)  IPADDR=$OPTARG
        ;;
    a)  APIKEY=$OPTARG
        ;;
    u)	USER=$OPTARG
	;;
    o)  VALUE=$OPTARG
	;;
    p)  PASSWD=$OPTARG
	;;
    d)  DEBUG=1
	;;
    esac
done

shift $((OPTIND-1))

[ "${1:-}" = "--" ] && shift

if [ -z $FUNC ] ; then
	usage
	exit 1
elif [ -z $CHANNEL ] ; then
	usage
	exit 1
elif [ -z $IPADDR ] ; then
	usage
	exit 1
fi

if [ $DEBUG -eq 1 ] ; then
	Debugmsg1=$Debugmsg1"Function: $FUNC\n"
        Debugmsg1=$Debugmsg1"Channel:  $CHANNEL\n"
        Debugmsg1=$Debugmsg1"IP-Addr:  $IPADDR\n"
        Debugmsg1=$Debugmsg1"API-Key:  $APIKEY\n"
        Debugmsg1=$Debugmsg1"Value:    $VALUE\n"
        Debugmsg1=$Debugmsg1"user:     $USER\n"
        Debugmsg1=$Debugmsg1"password: $PASSWD\n\n"
fi

CURL=/usr/bin/curl
CURL_timout='-m 5'

set_CCU_SysVar(){
	Debugmsg1=$Debugmsg1"set_CCU_SysVar: \n\t\tValue: $1\n\t\tCCU-System-Variable: $2\n"
        if [ "x$1" != "x" ]; then
                Debugmsg1=$Debugmsg1"\t\thttp://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27$2%27%29.State%28%22$1%22%29 \n"
                TEST=$(${CURL} -s $CURL_timout "http://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27$2%27%29.State%28%22$1%22%29")
        else
                Debugmsg1=$Debugmsg1"\t\t$IPADDR -> set_CCU_SysVar: $2 - Fehler, keine Status.\n"
                logger -i -t $0 -p 3 "$IPADDR -> set_CCU_SysVar: $2 - Fehler, keine Status."
        fi
}

set_CUxD_state(){
	Debugmsg1=$Debugmsg1"set_CUxD_state: \n\t\tValue: $1\n\t\tCUX-CHANNEL: $2\n"
        if [ "x$1" != "x" ]; then
                Debugmsg1=$Debugmsg1"\t\thttp://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27CUxD.$2.SET_STATE%27%29.State%28%22$1%22%29 \n"
                TEST=$(${CURL} -s $CURL_timout "http://$HOMEMATIC:8181/Test.exe?Status=dom.GetObject%28%27CUxD.$2.SET_STATE%27%29.State%28%22$1%22%29")
        else
                Debugmsg1=$Debugmsg1"\t\t$IPADDR -> set_CUxD_state: $2 - Fehler, keine Status.\n"
                logger -i -t $0 -p 3 "$IPADDR -> set_CUxD_state: $2 - Fehler, keine Status."
        fi
}

checkDevice(){
	TEST=$(ping -c 1 -w 1 $1)
	if [ $? -eq 0 ]
	then
		if [ -z $APIKEY ] ; then
			if [ "x$PASSWD" != 'x' ] ; then
				URL="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=status"
			else
				URL="http://${IPADDR}/cm?cmnd=status"
			fi
			SEARCH='status'
		else
			URL="http://${IPADDR}/apis?apikey=${APIKEY}"
			SEARCH='api'
		fi

		AVAILABLE=1 # Status: erreichbar
		STATE=$(${CURL} -s ${CURL_timout} "${URL}" | grep -i ${SEARCH})
		if [ $? -eq 0 ]
		then
			AVAILABLE=1 # Status: erreichbar
		else
			AVAILABLE=0 # Status: nicht erreichbar
		fi
	else
		AVAILABLE=0 # Status: nicht erreichbar
	fi
}

func_switch(){
	if [ $AVAILABLE -ge 1 ] ; then
		if [ -z $APIKEY ] ; then
			case $VALUE in
			      0)
				VALUE='Power%20Off'
				;;
			      1)
				VALUE='Power%20On'
				;;
			      2)
				VALUE='Power%20Toggle'
				;;
			esac
			if [ "x$PASSWD" != 'x' ] ; then

				URL="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=${VALUE}"
				URL2="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=Power"
			else
				URL="http://${IPADDR}/cm?cmnd=${VALUE}"
				URL2="http://${IPADDR}/cm?cmnd=Power"
			fi
		else
			URL="http://${IPADDR}/api/relay/0?apikey=${APIKEY}&value=${VALUE}"
			URL2="http://${IPADDR}/api/relay/0?apikey=${APIKEY}"
		fi
		Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
		TEST=$(${CURL} -s ${CURL_timout} "${URL}")
		Debugmsg1=$Debugmsg1"cmd: \t\t${CURL} -s ${CURL_timout} \"${URL2}\" \n"
		OUT=$(${CURL} -s ${CURL_timout} "${URL2}")
		STATE=$(echo $OUT | sed 's/{"POWER":"//g' | sed 's/"}//g' | sed 's/ON/1/g' | sed 's/OFF/0/g')
		echo -e "\tswitch[0|1]: ${STATE}"
		set_CUxD_state $STATE $CHANNEL
	fi
	echo -e "\t[$CHANNEL-status]:    \t$AVAILABLE"
	echo -e "\t[$CHANNEL-ipaddr]:    \t${IPADDR}"
	set_CCU_SysVar $AVAILABLE $CHANNEL-status
	set_CCU_SysVar ${IPADDR} $CHANNEL-ipaddr
}

func_switch_temperature(){
	STATE=0
	if [ $AVAILABLE -ge 1 ] ; then
                if [ -z $APIKEY ] ; then
                        if [ "x$PASSWD" != 'x' ] ; then
                                URL="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=status%2010"
                        else
                                URL="http://${IPADDR}/cm?cmnd=status%2010"
                        fi
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			STATE=$(${CURL} -s ${CURL_timout} "${URL}" | sed -e 's/"//g' -e 's/{//g' -e 's/}//g' | cut -d ',' -f2 | cut -d ':' -f3 )
                else
			URL="http://${IPADDR}/api/temperature?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			STATE=$(${CURL} -s ${CURL_timout} "${URL}")
		fi
		echo -e "\t[$CHANNEL-temperature]: \t$STATE C"
		set_CCU_SysVar $STATE $CHANNEL-temperature
	fi
}

func_switch_humidity(){
	STATE=0
	if [ $AVAILABLE -ge 1 ] ; then
                if [ -z $APIKEY ] ; then
                        if [ "x$PASSWD" != 'x' ] ; then
                                URL="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=status%2010"
                        else
                                URL="http://${IPADDR}/cm?cmnd=status%2010"
                        fi
                        Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
                        STATE=$(${CURL} -s ${CURL_timout} "${URL}" | sed -e 's/"//g' -e 's/{//g' -e 's/}//g' | cut -d ',' -f3 | cut -d ':' -f2 )
                else
                        URL="http://${IPADDR}/api/humidity?apikey=${APIKEY}"
                        Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
                        STATE=$(${CURL} -s ${CURL_timout} "${URL}")
                fi
		echo -e "\t[$CHANNEL-humidity]: \t$STATE %"
		set_CCU_SysVar $STATE $CHANNEL-humidity
	fi
}

func_switch_power(){
        STATE=0
	TOTAL=0
	YESTERDAY=0
	TODAY=0
	POWER=0
	FACTOR=0
	VOLTAGE=0
	AMPERE=0
        if [ $AVAILABLE -ge 1 ] ; then
                if [ -z $APIKEY ] ; then
                        if [ "x$PASSWD" != 'x' ] ; then
                                URL="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=status%2010"
                        else
                                URL="http://${IPADDR}/cm?cmnd=status%2010"
                        fi
                        Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
                        STATE=$(${CURL} -s ${CURL_timout} "${URL}" | grep -i energy | awk -F'{' '{ print $4 }' | sed -e 's/{//g' -e 's/}//g' -e 's/"//g')
			TOTAL=$(echo $STATE | cut -d, -f1 | cut -d: -f2 )
			TOTAL_EH='kWh'
			TOTAL_VAR='total'
			YESTERDAY=$(echo $STATE | cut -d, -f2 | cut -d: -f2 )
			YESTERDAY_EH='kWh'
			YESTERDAY_VAR='yesterday'
			TODAY=$(echo $STATE | cut -d, -f3 | cut -d: -f2 )
			TODAY_EH='kWh'
			TODAY_VAR='today'
			POWER=$(echo $STATE | cut -d, -f4 | cut -d: -f2 )
			POWER_EH='W'
			POWER_VAR='power'
			FACTOR=$(echo $STATE | cut -d, -f5 | cut -d: -f2 )
			FACTOR_EH=''
			FACTOR_VAR='factor'
			VOLTAGE=$(echo $STATE | cut -d, -f6 | cut -d: -f2 )
			VOLTAGE_VAR='voltage'
			AMPERE=$(echo $STATE | cut -d, -f7 | cut -d: -f2 )
			AMPERE_VAR='ampere'
                else
                        URL="http://${IPADDR}/api/current?apikey=${APIKEY}"
                        Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
                        AMPERE=$(${CURL} -s ${CURL_timout} "${URL}")
			AMPERE_VAR='ampere'
			URL="http://${IPADDR}/api/voltage?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			VOLTAGE=$(${CURL} -s ${CURL_timout} "${URL}")
			VOLTAGE_VAR='voltage'
			URL="http://${IPADDR}/api/power?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			POWER=$(${CURL} -s ${CURL_timout} "${URL}")
			POWER_EH='W'
			POWER_VAR='power'
			URL="http://${IPADDR}/api/factor?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			FACTOR=$(${CURL} -s ${CURL_timout} "${URL}")
			FACTOR_EH='%'
			FACTOR_VAR='factor'
			URL="http://${IPADDR}/api/energy?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			TOTAL=$(${CURL} -s ${CURL_timout} "${URL}")
			TOTAL_EH='J'
			TOTAL_VAR='energy'
			URL="http://${IPADDR}/api/apparent?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			YESTERDAY=$(${CURL} -s ${CURL_timout} "${URL}")
			YESTERDAY_EH='W'
			YESTERDAY_VAR='apparent'
			URL="http://${IPADDR}/api/reactive?apikey=${APIKEY}"
			Debugmsg1=$Debugmsg1"func:   \t\t$FUNC\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			TODAY=$(${CURL} -s ${CURL_timout} "${URL}")
			TODAY_EH='W'
			TODAY_VAR='reactive'
                fi
                echo -e "\t[${CHANNEL}-${TOTAL_VAR}]:    \t$TOTAL $TOTAL_EH"
		echo -e "\t[${CHANNEL}-${YESTERDAY_VAR}]:\t$YESTERDAY $YESTERDAY_EH"
		echo -e "\t[${CHANNEL}-${TODAY_VAR}]:    \t$TODAY $TODAY_EH"
		echo -e "\t[${CHANNEL}-${POWER_VAR}]:    \t$POWER $POWER_EH"
		echo -e "\t[${CHANNEL}-${FACTOR_VAR}]:   \t$FACTOR $FACTOR_EH"
		echo -e "\t[${CHANNEL}-${VOLTAGE_VAR}]:  \t$VOLTAGE V"
		echo -e "\t[${CHANNEL}-${AMPERE_VAR}]:   \t$AMPERE A"
                set_CCU_SysVar $TOTAL $CHANNEL-${TOTAL_VAR}
	       	set_CCU_SysVar $YESTERDAY $CHANNEL-${YESTERDAY_VAR}
		set_CCU_SysVar $TODAY $CHANNEL-${TODAY_VAR}
		set_CCU_SysVar $POWER $CHANNEL-${POWER_VAR}
		set_CCU_SysVar $FACTOR $CHANNEL-${FACTOR_VAR}
		set_CCU_SysVar $VOLTAGE $CHANNEL-voltage
		set_CCU_SysVar $AMPERE $CHANNEL-ampere
       fi
}


case $FUNC in
        "switch")
		checkDevice $IPADDR
		func_switch $1
		;;
	"switch-t")
		checkDevice $IPADDR
		func_switch $1
		func_switch_temperature $1
		;;
	"switch-p")
		checkDevice $IPADDR
		func_switch $1
		func_switch_power $1
		;;
	"switch-th")
		checkDevice $IPADDR
		func_switch $1
		func_switch_temperature $1
		func_switch_humidity $1
		;;
	"status")
		checkDevice $IPADDR
		if [ $AVAILABLE -ge 1 ] ; then
			if [ -z $APIKEY ] ; then
				if [ "x$PASSWD" != 'x' ] ; then
					URL="http://${IPADDR}/cm?user=${USER}&password=${PASSWD}&cmnd=status"
				else
					URL="http://${IPADDR}/cm?&cmnd=status"
				fi
			else
				URL="http://${IPADDR}/apis?apikey=${APIKEY}"
			fi
			Debugmsg1=$Debugmsg1"func:   \t\t$1\ncmd: \t\t${CURL} -s ${CURL_timout} \"${URL}\" \n"
			TEST=$(${CURL} -s ${CURL_timout} "${URL}")
			echo $TEST
		else
			echo -e "api-key or ip-adresse are wrong"
			echo -e "couldn't connect to device\n"
		fi
		;;
	*)
		usage
		exit 1
		;;
esac

if [ $DEBUG -eq 1 ]
then
	echo -e "\n\n"
	echo -e "-----------------------------------------------------------------------------------------------------"
	echo -e "   		               		Debug Ausgaben"
	echo -e "-----------------------------------------------------------------------------------------------------"
	echo -e $Debugmsg1
fi
exit 0
Das Skript unterstützt die folgenden Geräte bzw. wurde damit getestet:
itead SONOFF Basic [getestet mit espurna und tasmota]: http://sonoff.itead.cc/en/products/sonoff/sonoff-basic
itead SONOFF TH10 [getestet mit espurna und tasmota]: http://sonoff.itead.cc/en/products/sonoff/sonoff-th
itead SONOFF Pow [getestet mit espurna (die Werte bei espurna sind nicht verwertbar) und tasmota]: http://sonoff.itead.cc/en/products/sonoff/sonoff-pow
OBI Steckdose [getestet mit tasmota]: viewtopic.php?f=31&t=42958 bzw. https://github.com/arendst/Sonoff-Tasmo ... Obi-Socket

Antworten

Zurück zu „CUxD“