[Neues Modul] BOSE SoundTouch

Begonnen von dominik, 05 Januar 2016, 22:28:40

Vorheriges Thema - Nächstes Thema

betateilchen

Hat jemand eine Idee, wie ich die dauernden Verbindungsabbrüche bekämpfen kann?


2017.01.11 16:32:12.063 3: BOSEST: wz_st10, WebSocket connection dropped - try reconnect.
2017.01.11 16:32:21.280 3: BOSEST: wz_st10, new IP (192.168.123.226)
2017.01.11 16:32:22.630 3: BOSEST: wz_st10, WebSocket connection succeed.

2017.01.11 17:25:30.009 3: BOSEST: wz_st10, WebSocket connection dropped - try reconnect.
2017.01.11 17:25:35.141 3: BOSEST: wz_st10, new IP (192.168.123.226)
2017.01.11 17:25:37.627 3: BOSEST: wz_st10, WebSocket connection succeed.

2017.01.11 17:51:30.792 3: BOSEST: wz_st10, WebSocket connection dropped - try reconnect.
2017.01.11 17:51:39.007 3: BOSEST: wz_st10, new IP (192.168.123.226)
2017.01.11 17:51:40.122 3: BOSEST: wz_st10, WebSocket connection succeed.

2017.01.11 17:58:28.974 3: BOSEST: wz_st10, WebSocket connection dropped - try reconnect.
2017.01.11 17:58:47.087 3: BOSEST: wz_st10, new IP (192.168.123.226)
2017.01.11 17:58:47.774 3: BOSEST: wz_st10, WebSocket connection succeed.

2017.01.11 17:59:40.006 3: BOSEST: wz_st10, WebSocket connection dropped - try reconnect.
2017.01.11 17:59:57.483 3: BOSEST: wz_st10, new IP (192.168.123.226)
2017.01.11 17:59:58.827 3: BOSEST: wz_st10, WebSocket connection succeed.

2017.01.11 18:08:36.134 3: BOSEST: wz_st10, WebSocket connection dropped - try reconnect.
2017.01.11 18:09:20.599 3: BOSEST: wz_st10, new IP (192.168.123.226)
2017.01.11 18:09:22.629 3: BOSEST: wz_st10, WebSocket connection succeed.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dominik

Ich bekome die Meldung ebenfalls ca. 3-5x am Tag. Ich vermute es liegt wirklich an der WLAN Verbindung. Ansonsten könnte es noch an Mojolicious liegen welches man aktualisieren könnte. Aber wie gesagt, ich tippe auf WLAN. Kannst ja mal probieren die Box in die Nähe des Routers zu stellen.

Btw, Update für "unlimited" Text bei TTS stelle ich am Wochenende bereit :)
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

dominik

#377
Update...bitte um Testing und Rückmeldung

v2.1.0 - 20170114 - to be released
- NEW REQUIREMENT: sox, libsox-fmt-mp3
- FEATURE: add 1 second silence before TTS message for speak to
            prevent low volume on first words
- FEATURE: support "unlimited" characters in TTS speak.
            Text is split in sentences which are afterwards
            merged with sox. Same sentences are downloaded
            only once a month to reduce requests to Google.
- BUGFIX:  fix resume after speak when spotify running
- BUGFIX:  fix speakChannel for spotify presets
- BUGFIX:  fix save spotify to channel_7-20
- BUGFIX:  improved check after TTS play to restore previous state
- BUGFIX:  fix list of arguments
- FEATURE: add $readingFnAttributes
- FEATURE: add playPause toggle command
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Masterciw

Hallo und guten Abend,

@ Dominik: Modul heruntergeladen und Abhängigkeiten installiert. Getestet und okay.

Was mit jedoch auffällt ist die Aussprache von Umlauten.

Gehe ich in WebUI und lasse einen Satz wie z.B: "Ab in die Küche" kommt etwas anderes heraus als wenn ich die Ausgabe in der Config mache wie. z.B:
define Bose_Durchsage at *20:56:00 set WZ_BOSE_SoundTouch20 speak "Ab in die Küche" 65
Hierbei wir das ü nicht korrekt ausgesprochen.

Der zeitliche Versatz von einer Sekunde ist okay.

Versuche ich beim eingehenden Anrufen eine Durchsage zu machen, wird die Variable ausgesprochen anstatt den korrekten Inhalt dort einzusetzen.
{fhem ('set WZ_BOSE_SoundTouch20 speak "Anruf von $Name" 55')}

Vermutlich habe ich da Probleme mit den "

Ist es irgendwie möglich ähnlich wie bei der Sprachausgabe mit TTS auch MP3 Dateien wie z.B. einen Gong vor der Durchsage auszugeben und wie muss das
in der Config definiert werden?

Gruß Michael


betateilchen

Zitat von: dominik am 15 Januar 2017, 11:42:21
Update...bitte um Testing und Rückmeldung

v2.1.0 - 20170114 - to be released
- NEW REQUIREMENT: sox, libsox-fmt-mp3



root@fhem-enocean:/home/udo# apt-get install sox libsox-fmt-mp3
...
Die folgenden zusätzlichen Pakete werden installiert:
...
Die folgenden NEUEN Pakete werden installiert:
...
0 aktualisiert, 20 neu installiert, 0 zu entfernen und 13 nicht aktualisiert.
Es müssen noch 1.256 kB von 1.776 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 3.816 kB Plattenplatz zusätzlich benutzt.


Da werden mindestens 20 Pakete neu installiert, die ich nicht brauche, weil ich nicht mit TTS arbeite (und das auch zukünftig nicht).

Kannst Du bitte das Modul so gestalten, dass man es komplett ohne TTS (und dessen Abhängigkeiten) nutzen kann?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: dominik am 13 Januar 2017, 19:28:00
Kannst ja mal probieren die Box in die Nähe des Routers zu stellen.

Die stehen Luftlinie 7m mit freier Sicht auseinander, innerhalb des gleichen Raumes wohlgemerkt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Masterciw am 16 Januar 2017, 21:23:18
Versuche ich beim eingehenden Anrufen eine Durchsage zu machen, wird die Variable ausgesprochen anstatt den korrekten Inhalt dort einzusetzen.
{fhem ('set WZ_BOSE_SoundTouch20 speak "Anruf von $Name" 55')}

Vermutlich habe ich da Probleme mit den "

Du hast eher ein Problem mit fehlenden perl Grundlagenkenntnissen ;)

Probier mal, ob das funktioniert:


{fhem ('set WZ_BOSE_SoundTouch20 speak "Anruf von '.$Name.'" 55')}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Masterciw

Hallo und guten Abend,

@ Betateilchen: Vielen Dank, das war es. Was Perl angeht bin ich gerade dabei meine ersten Schritte zu machen.
Komme aus der Windowswelt und nutze daher Batch, VBScript und Powershell. Auch wenn einiges Ähnlichkeit hat,
gibt es leider doch auch recht gravierende Unterschiede.

Malc

Ich komme einfach nicht weiter.

Ein ganz frischer pi mit "2017-01-11-raspbian-jessie.img" + update + fhem weigert sich minidlna zu nutzen.

Ich habe nach dem Eingangspost problemlos das BOSET zum laufen bekommen aber minidlna bekomme ich einfach nicht hin, ich habe da schon ungelogen locker 10h rumprobiert, so langsam gehen mir die Ideen aus. Das mag sicher auch daran liegen das ich noch wenig Erfahrung mit dem pi habe, keine Frage.

Das sind die Befehle die ich verwende:

sudo apt-get install libexif-dev libjpeg-dev libflac-dev libvorbis-dev libsqlite3-dev libavformat-dev libid3tag0-dev
sudo apt-get install autoconf gettext
-> autoconf und gettext fehlten bei meinem Image

sudo apt-get build-dep minidlna
-> Diese Meldung bekomme ich und hab keine Ahnung ob ich da was tun kann
-> E: Sie müssen einige »source«-URIs für Quellpakete in die sources.list-Datei eintragen.

mkdir minidlna
cd minidlna
git clone git://git.code.sf.net/p/minidlna/git minidlna-git
cd minidlna-git
./autogen.sh && ./configure && sudo make && sudo make install

sudo cp minidlna.conf /etc/
sudo cp linux/minidlna.init.d.script /etc/init.d/minidlna
> sonst habe ich nix zum anpassen

sudo nano /etc/minidlna.conf
> nach eingangspost angepasst

sudo nano /etc/init.d/minidlna
> nach eingangspost angepasst


sudo chmod +x /etc/init.d/minidlna

sudo mkdir /var/lib/minidlna
sudo chmod 777 /var/lib/minidlna
sudo service minidlna start
> Failed to start minidlna.service: Unit minidlna.service failed to load: No such file or directory.


Ich bin mir sicher das ich irgendwas übersehen habe, nur finde ich es nicht. Ich habe schon so oft von vorn angefangen, immer ein Schnipsel in irgendeinem Forum gefunden. Aber jetzt stehe ich auf dem Schlauch.

Mit der Bitte um Unterstützung :-)


Wenzel






Failed to start minidlna.service: Unit minidlna.service failed to load: No such file or directory.


Masterciw

@ Malc: Die Installation des Minidlna wie am Anfang des Threads beschrieben hat bei mir ebenfalls nicht
funktioniert. Versuche mal den Minidlna aus dem Package Repositories zu installieren.

Zuvor alles von Minidlna removen
sudo apt-get purge minidlna -y
sudo apt-get remove minidlna
sudo apt-get autoremove -y
sudo rm /etc/minidlna.conf
sudo rm /etc/init.d/minidlna

Dann Jessie auf den neusten Stand aktualisieren
sudo apt-get update
sudo apt-get upgrade

Im Anschluss Minidlna installieren
sudo apt-get install minidlna

Dann Konfiguration für minidlna erstellen
sudo nano /etc/minidlna.conf


media_dir=/var/lib/minidlna
port=8200
serial=12345678
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg
album_art_names=AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg
album_art_names=Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg


Dann Startscript für Minidlna erstellen
sudo nano /etc/init.d/minidlna


#!/bin/sh
#
# MiniDLNA initscript
#
# Based on the mediatomb debian package.
# Original authors: Tor Krill <tor@excito.com>
#                   Leonhard Wimmer <leo@mediatomb.cc>
#                   Andres Mejia <mcitadel@gmail.com>
#
# Modified by: Benoît Knecht <benoit.knecht@fsfe.org>
#
### BEGIN INIT INFO
# Provides:          minidlna
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop::    $network $local_fs $remote_fs
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start minidlna at boot time
# Description:       Manage the minidlna daemon, a DLNA/UPnP-AV media server.
### END INIT INFO

unset USER

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
DESC="DLNA/UPnP-AV media server"
NAME=minidlna
DAEMON=/usr/local/sbin/minidlnad
PIDDIR=/run/$NAME
PIDFILE=$PIDDIR/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
DEFAULT=/etc/default/$NAME

# Exit if the package is not installed
[ -x $DAEMON ] || exit 0

# Read configuration variable file if it is present
[ -r $DEFAULT ] && . $DEFAULT

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Do not start the daemon if NO_START is enabled in DEFAULT
if [ "$START_DAEMON" != "yes" ] && [ "$1" != "stop" ]; then
        log_warning_msg "$NAME: Not starting $DESC."
        log_warning_msg "$NAME: Disabled in $DEFAULT."
        exit 0
fi

# Set the default configuration file
if [ -z $CONFIGFILE ]; then
        CONFIGFILE=/etc/minidlna.conf
fi

# Set the default log file
if [ -z $LOGFILE ]; then
        LOGFILE=/var/log/minidlna.log
fi

# Run as `minidlna' if USER is not specified or is `root'
if [ -z $USER ]; then
        USER=minidlna
fi

# If no group is specified, use USER
if [ -z $GROUP ]; then
        GROUP=$USER
fi

DAEMON_ARGS="-f $CONFIGFILE -P $PIDFILE $DAEMON_OPTS"

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        touch $LOGFILE && chown $USER:$GROUP $LOGFILE || return 2
        if [ ! -d $PIDDIR ]; then
            mkdir $PIDDIR || return 2
        fi
        chown $USER:$GROUP $PIDDIR || return 2

        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -rf $PIDDIR
        return "$RETVAL"
}

#
# Function that signals log rotation to the daemon/service
#
do_rotate()
{
        start-stop-daemon --stop --quiet --signal USR1 --pidfile $PIDFILE --exec $DAEMON
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
    do_start
    case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
  ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                if [ "$1" = "force-reload" ]; then
                        # Rescan the collection
                        DAEMON_ARGS="$DAEMON_ARGS -R"
                fi
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  rotate)
        log_daemon_msg "Reopening log file $LOGFILE"
        do_rotate
        log_end_msg $?
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|rotate}" >&2
        exit 3
        ;;
esac

:


Nun sollte man noch die Berechtigungen auf den Ordner /var/lib/minidlna korrekt setzen falls nicht bereits erfolgt.
sudo chown 0755 /var/lib/minidlna (so steht es derzeit bei mir)

Danach rebooten und mit
sudo service minidlna status
prüfen ob minidlna gestartet wurde.

Sollte dies funktionieren nun nochmals eine Sprachausgabe generieren, z.B:
set Bose_fafafaf speak "Dies ist ein Test" 40 de

Nun wird der Text im Hintergrund zu Google hochgeladen und als MP3 zurückgeliefert.
Diese sollte sich idealerweise im Ordner /var/lib/minidlna befinden und könnte z.B so heißen:
63778d4308de213aaec4e26fcf9ab286.mp3

Wird diese Datei dort nicht hinterlegt so stimmt meist was mit den Zugriffsberechtigungen auf den Ordner nicht.

Wurde die Datei dort erfolgreich erstellt sollte diese dann erfolgreich auf den Bose Devices ausgegeben werden.

Viel Glück

@ Dominik: Wir sollten die Anleitung zur Installation von Minidlna im ersten Post mal überarbeiten und das Ganze auch
dementsprechend im Wiki vermerken. Sobald ich weiss ich dazu die Berechtigungen erlange, könnte ich mich ans Werk machen.

Gruß und einen schönen Abend noch.

Masterciw







Malc

Hallo Masterciw,
vielen Dank für deine Anleitung. Ich bin ja schon mal beruhigt das ich nicht der einzige bin bei dem das nicht funktioniert.

Ich habe deine Schritte befolgt und bin aber leider nicht wesentlich weiter. Der minidnla läuft, ich kann via VLC Files abspielen. Sobald ich aber mit der Bose App den server ansprechen will (hinzufügen kann ich ihn) bricht er ab. Auch wenn ich über FHEM ein text sprechen lassen will stoppt der server. 

Anbei ein Auszug aus dem minidlna.log, irgendwas muss ich doch anders als andere machen.. argh.


pragma default_cache_size = 8192;
[2017/01/19 09:21:13] minidlna.c:1043: warn: HTTP listening on port 8200
[2017/01/19 09:21:13] inotify.c:198: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [2] and I do not have permiss$
[2017/01/19 09:22:57] upnphttp.c:1043: warn: HTTP Connection closed unexpectedly
[2017/01/19 09:24:54] minidlna.c:1004: warn: Starting MiniDLNA version 1.1.2.
[2017/01/19 09:24:54] sql.c:41: error: SQL ERROR 8 [attempt to write a readonly database]
pragma default_cache_size = 8192;
[2017/01/19 09:24:54] minidlna.c:1043: warn: HTTP listening on port 8200
[2017/01/19 09:24:54] inotify.c:198: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [2] and I do not have permiss$
[2017/01/19 09:25:29] upnphttp.c:1043: warn: HTTP Connection closed unexpectedly
[2017/01/19 09:25:53] upnphttp.c:1043: warn: HTTP Connection closed unexpectedly
[2017/01/19 09:32:49] minidlna.c:153: warn: received signal 15, good-bye
[2017/01/19 09:32:49] sql.c:41: error: SQL ERROR 8 [attempt to write a readonly database]
UPDATE SETTINGS set VALUE = '14' where KEY = 'UPDATE_ID'
[2017/01/19 09:32:52] minidlna.c:1022: warn: Starting MiniDLNA version 1.1.6.
[2017/01/19 09:32:52] minidlna.c:1062: warn: HTTP listening on port 8200
[2017/01/19 09:34:17] upnphttp.c:1061: warn: HTTP Connection closed unexpectedly
[2017/01/19 09:34:57] upnphttp.c:1061: warn: HTTP Connection closed unexpectedly
[2017/01/19 09:37:08] minidlna.c:154: warn: received signal 15, good-bye

Malc

So, ich glaube ich bin einen Schritt weitergekommen!

-Der Fehler lag an meiner verwursteten /etc/init.d/minidlna. Ich habe mir noch mal eine "nackte" gesucht und dann die Änderungen eingebaut.

Die ersten Sprachausgaben haben funktioniert, hurra!

Zur Zeit startet der minidlna noch nicht automatisch, aber das werde ich wohl noch rausfinden. Schön ist aber das jetzt im ganzen Haus zu hören ist wenn die Waschmaschine fertig ist :-)

Malc

Masterciw

Hallo Malc,

freut mich zu hören das Du weiter gekommen bist.
Was den Autostart des minidlna angeht könntest Du mal die Berechtigungen überprüfen.

Ich habe das bereits gepostete Script verwendet und keinerlei Probleme damit.
Die Berechtigungen stehen bei mir auf 0755.

Vielleicht hilft Dir das weiter.

Gruß und einen schönen Abend noch.

Masterciw

dominik

#388
@betateilchen, ich schau mir das mal an, ob ich die sox Abhängigkeit nur in den TTS Teil implementieren kann.
//Update Mir ist gerade eingefallen, dass ich sowieso nur die Binary bei TTS Aufrufe. Von daher gibt es keine Lib Abhängigkeit. Eine Prüfung auf SOX hab ich noch nicht eingebaut für die Testversion, folgt noch. Du kannst also die neue Version bereits nutzen.

Ein Bug ist mir in der Version noch aufgefallen. Beim TTS wird das Satzende nicht an Google Translate gesendet, daher klingen Fragen am Satzende nicht optimal. Das wird von mir noch behoben.

Des Weiteren muss man dazu sagen, dass Sätze maximal 100 Zeichen haben dürfen. Sollte jemand der Meinung sein, dass das zu wenig ist, dann lasst es mich wissen. Eine Komma Trennung wäre vielleicht auch noch möglich.

Bzgl. "Gong" zu Beginn, das sollte kein Problem sein es einzubauen. Ich baue jetzt schon mit SOX die "Stille" zu beginn zusammen, ein Gong wäre einfach eine weitere Datei. Gibt es den Gong irgendwo im Internet frei verfügbar zum Runterladen? Für Experten kann ich gerne jegliche MP3 hinzufügen lassen, aber ich bin sonst ein Freund von "so wenig Konfiguration wie möglich".
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

dominik

Anbei noch ein Update...wenn es damit keine Probleme gibt, werde ich es die nächsten Tage ins Repository aufnehmen.
Änderungen seit letzter Woche in grün.

v2.1.0 - 20170121 - to be released
- NEW REQUIREMENT: TTS: sox, libsox-fmt-mp3 (only required for TTS)
- FEATURE: TTS: add 1 second silence before TTS message for speak to
            prevent low volume on first words
- FEATURE: TTS: support "unlimited" characters in TTS speak.
            Text is split in sentences which are afterwards
            merged with sox. Same sentences are downloaded
            only once a month to reduce requests to Google.
- BUGFIX:  TTS: use last character of the sentence for translate (e.g. ?, !)
- BUGFIX:  TTS: support pause/stop after speak if previous state was paused/stopped
- BUGFIX:  TTS: restore last played item also when in standby
- BUGFIX:  TTS: fix resume after speak when spotify running
- BUGFIX:  TTS: fix speakChannel for spotify presets
- BUGFIX:  TTS: use pause on TTS instead of stop to allow proper resume
- BUGFIX:  TTS: improved check after TTS play to restore previous state
- BUGFIX:  fix save spotify to channel_7-20
- BUGFIX:  fix list of arguments
- FEATURE: add $readingFnAttributes
- FEATURE: add playPause toggle command
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik