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

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

Moderator: Co-Administratoren

frodo.
Beiträge: 11
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) 1398 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) 1389 mal betrachtet
Auf Posteingang klicken:
CCU2-2.jpg
CCU2-2.jpg (7.79 KiB) 1389 mal betrachtet
Und mit "Fertig" übernehmen:
CCU2-3.jpg
CCU2-3.jpg (19.81 KiB) 1389 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: 11
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

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

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

Beitrag von frodo. » 29.08.2018, 06:07

Die letzte Version ist nun auf github zu finden:
https://github.com/FrodoVDR/tasmota-ccu/releases

jp112sdl
Beiträge: 1421
Registriert: 20.11.2016, 21:01
Kontaktdaten:

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

Beitrag von jp112sdl » 29.08.2018, 14:28

Genau für diesen Zweck ("Statusrückmeldung an CCU" (oder auch Loxone)) habe ich vor längerer Zeit mal die FW "SonoffHMLOX" geschrieben.
https://github.com/jp112sdl/SonoffHMLOX
VG,
Jérôme



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

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

Beitrag von frodo. » 29.08.2018, 16:12

Was kann den die Firmware von Dir besser als Tasmota oder Espurna? MQTT, Alexa Unterstützung, usw. ist wohl nicht dabei ausserdem dürfte die unterstützte Hardware von Tasmota auch größer sein.

Wenn ich mir das Video anschaue muß ich für das schalten der Aktoren eine Url für "ein" und eine für "aus" definieren, somit könnte ich auch Tasmota oder Espurna verwenden. In wieweit man den aktuellen Status zurückbekommt kann man im Wiki oder im Video leider nicht sehen. Mit meiner Lösung klappt das.

Letztendlich ist es auch egal viele Wege führen nach Rom :-)

Aktuell getestet habe ich mein Skript mit Tasmota und den folgenden Aktoren:

Sonoff basic
Sonoff POW
Sonoff TH10
Sonoff 4CH pro
Wemos D1 mini
Obi Steckdose

Wenn es ums reine schalten geht sollten aber alle mit Tasmota geflashten Aktoren funktionieren.

Demnächst werde ich mir noch den Shelly 1 Aktor (https://shelly.cloud/shelly1-open-source/, https://www.youtube.com/watch?v=J20hxfUTP9I) näher anschauen - wenn er wieder lieferbar ist.
Zuletzt geändert von frodo. am 29.08.2018, 17:01, insgesamt 1-mal geändert.

jp112sdl
Beiträge: 1421
Registriert: 20.11.2016, 21:01
Kontaktdaten:

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

Beitrag von jp112sdl » 29.08.2018, 16:28

frodo. hat geschrieben:
29.08.2018, 16:12
Was kann den die Firmware von Dir besser als Tasmota oder Espurna?
Sie kann ohne aufwendiges Gescripte den Status an den CUxD Kanal senden, wenn man das Gerät zB am Taster bedient.
frodo. hat geschrieben:
29.08.2018, 16:12
MQTT, Alexa Unterstützung, usw. ist wohl nicht dabei ausserdem dürfte die unterstützte Hardware von Tasmota auch größer sein.
Jup, ich wollte auch nur eine Hand voll gebräuchlicher Geräte unterstützen.
Zumal es in erster Linie um ausschließliche CCU-Steuerung geht. Kein MQTT etc... Dafür gibts halt Tasmota.
frodo. hat geschrieben:
29.08.2018, 16:12
Letztendlich ist es auch egal viele Wege führen nach Rom.
Genau. Mittlerweile mache ich in der Richtung "Wifi" auch nichts mehr, sondern baue die Geräte auf 868MHz Homematic Funk um.
Dann lassen sie sich ganz normal anlernen und auch direktverknüpfen.
Besonders dann von Vorteil, wenn der AP/Router mal kaputt sein sollte, oder das LAN Kabel aus der CCU gerutscht ist. :wink: :mrgreen:
Funktioniert halt ohne externe Infrastruktur (CUxD Addon, LAN / WLAN usw.)
Aber wie gesagt - da gehts mir in erster Linie um reine CCU-Steuerung (oder halt Direktverknüpfung).
VG,
Jérôme



Günni67
Beiträge: 3
Registriert: 22.09.2018, 14:36

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

Beitrag von Günni67 » 22.09.2018, 14:43

Vielen Dank für dein Script. Klappt wunderbar.
Ich habe noch einen Touch 2 Gang und einen 4Chanal Pro jeweils mit Espurna geflasht.
Kann man diese auch einbinden und wenn ja welche Parameter müsste ich ändern?

Kannst du mir dazu ein Beispiel geben?

Wäre super wenn das klappen würde. Dann hätte ich alle meine Sonoff in der CCU2 eingebunden.

Vielen Dank
Gruiß
Günni

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

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

Beitrag von frodo. » 22.09.2018, 16:13

Ich muss mir erst einmal einen passenden 4 Kanal Schalter mit espurna mit einem wemos D1 mini nachbauen, ich habe alles auf Tasmota geflashed da man hier mehr Möglichkeiten hat.

Für Tasmota habe ich den zusätzlichen Parameter -n Eingebaut bei dem ich das Relay 1-4 einfach mit gebe. Bei Espurna sollte es ähnlich funktionieren der Teil des Codes wo es angepasst werden müsste ist hier:

Code: Alles auswählen

func_switch(){
        if [ $AVAILABLE -ge 1 ] ; then
                if [ -z $APIKEY ] ; then
                        case $VALUE in
                              0)
                                VALUE="Power${RELNR}%20Off"
                                ;;
                              1)
                                VALUE="Power${RELNR}%20On"
                                ;;
                              2)
                                VALUE="Power${RELNR}%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${RELNR}"
                        fi
                else
                        URL="http://${IPADDR}/api/relay/0?apikey=${APIKEY}&value=${VALUE}"
                        URL2="http://${IPADDR}/api/relay/0?apikey=${APIKEY}"
                fi
Im Prinzio muß die Variable ${RELNR} in die folgenden Zeilen eingebaut werden:

Code: Alles auswählen

                        URL="http://${IPADDR}/api/relay/0?apikey=${APIKEY}&value=${VALUE}"
                        URL2="http://${IPADDR}/api/relay/0?apikey=${APIKEY}"
Ich möchte das Skript komplett neu schreiben und mittels eine MQTT Clients auf die Aktoren zugreifen das dürfte flexiber sein.
Ich muß dafür aber erst einmal Zeit finden.Inwieweit das aber mit der Oriuginal CCU2 noch funktioniert weis ich nicht, es sollte aber bei weitem nicht so viel Resourcen benötigenn wie nodered.

Hier findet man die passenden Addons für die CCU3 und Raspberrymatic: https://github.com/hobbyquaker/ccu-addon-mosquitto

Günni67
Beiträge: 3
Registriert: 22.09.2018, 14:36

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

Beitrag von Günni67 » 22.09.2018, 17:36

Danke. Werde ich mal probieren.
98% läuft ja jetzt bei mir dank deinem Script. Sind nur noch diese beiden Geräte übrig
Ich hatte das Gefühl das meine Sonoffs mit Espurna schneller reagieren als mit Tasmota und hab deshalb alles mit Espurna. Ist aber subjektiv.

Gruß
Günni

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

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

Beitrag von frodo. » 22.09.2018, 22:06

Ich habe es im git angepasst, mit -n kann man nun auch bei espurna das Relay angeben.

Im Gegensatz zu sonoff ist das erste Relay 0 und das zweite 1 usw.
Bei sonoff ist das erste Relay 1 das zweite 2 usw.

Getestet habe ich es mit sonoff 4ch pro und espurna generic 8ch .
espurna_8ch_1.png
espurna_8ch_1.png (15.07 KiB) 466 mal betrachtet
espurna_8ch_2.png
espurna_8ch_2.png (19.08 KiB) 466 mal betrachtet
Für den Touch 2 Gang habe ich keine Idee, was tut das Gerät? Ist das einfach ein zweifach Aktor mit Bedienung? Wenn ja sollte der nun auch funktionieren.

Antworten

Zurück zu „CUxD“