Sonos steuern

Begonnen von Will, 05 Januar 2013, 15:51:12

Vorheriges Thema - Nächstes Thema

MandelHL

#1455
Hi Reinerlein,

ich suche mir echt einen Wolf.

So sieht meine Haustuer.cfg jetzt aus:
define Haustuerkontakt notify Sensor_Haustuer:open {\
    my @@fenster = ();;\
    push(@@fenster, 'Badezimmerfenster_EG') if (Value("Sensor_Badezimmerfenster_EG") eq "open");;\
    push(@@fenster, 'Schlafzimmerfenster') if (Value("Sensor_Schlafzimmerfenster") eq "open");;\
if ($#fenster && (Value("Sensor_Haustuer") eq "open")) {\
my $durchsage = 'Achtung! Die Haustür wurde geöffnet. Folgende Fenster sind noch offen: '.join(', ', @@fenster);;\
fhem('set Sonos_Kueche Speak 45 de '.$durchsage);;\
fhem('set Sonos_Bad_EG Speak 35 de '.$durchsage);;\
DebianMail('XXXXXXX@@XXXXXX','Bitte Fenster schliessen!','Die Haustür wurde geöffnet. Der aktuelle Zustand der Fenster ist: Badezimmer ist '.Value("Sensor_Badezimmerfenster_EG") .', Schlafzimmer ist '.Value("Sensor_Schlafzimmerfenster").'       ');;\
DebianMail('XXXXXXXX@@gmail.com','Bitte Fenster schliessen!','Die Haustür wurde geöffnet. Der aktuelle Zustand der Fenster ist: Badezimmer ist '.Value("Sensor_Badezimmerfenster_EG") .', Schlafzimmer ist '.Value("Sensor_Schlafzimmerfenster").'       ');;\
}\
}


Leider kommt nachwievor eine Fehlermeldung:
2015.01.20 01:18:07 3: Haustuerkontakt return value: Unknown command {
, try help.
Unknown command push(@fenster,, try help.
Unknown command push(@fenster,, try help.
IF: no right bracket: ($


Hast Du noch eine Idee?

Danke und viele Grüße
Mandel

rapster

Hallo MandelHH,

schau dir mal diese Funktion hier an, habe ich einst für so einen Zweck geschrieben: http://forum.fhem.de/index.php?topic=29684.0

Da legst du dir z.B. einen Dummy an, welcher die Konfiguration enthält,

# list gotoSleep_checkFensterkontakte

Internals:
   CFGFN      ./FHEM/monitor.cfg
   NAME       gotoSleep_checkFensterkontakte
   NR         502
   STATE      rc_GREEN
   TYPE       dummy
   Readings:
     2015-01-19 01:38:27   LastResult      Found 5 devices, open: 0 closed: 5 unknown: 0
     2015-01-19 01:38:27   state           rc_GREEN
Attributes:
   badCommand set Sonos_Schlafzimmer Speak 18 de Achtung die Fenster %contacts% sind noch geöffnet.
   checkType  CUL_HM
   goodState  closed
   room       Monitor
   searchRegExp ^(?!vccu_|FileLog).+fensterkontakt.*
   unknownCommand set Sonos_Schlafzimmer Speak 18 de Achtung der Status der Fenster %contacts% ist unbekannt.
   userattr   searchRegExp checkType goodState:closed,open goodCommand badCommand unknownCommand contactsDelimiter


und rufst die Funktion einfach in über 'gotoSleep()' irgendwo auf.

BTW: Da dein Problem nicht wirklich was mit Reinerlein seinem Modul zu tun hat, wäre es warscheinlich in Anfängerfragen besser aufgehoben. Hier würde evtl. auch eine höhere Resonanz darauf erfolgen?

Gruß

Reinerlein

Hallo Mandel,

es scheint so zu sein, dass hinter dem #-Zeichen in der If-Anweisung abgeschnitten wird.

Schreib mal anstatt "$#fenster" ein "scalar(@@fenster)" hin.

Ansonsten scheint mir das Modul von rapster auch sehr gut geeignet zu sein... Da müsstest du nur noch schauen, wie du den zusätzlichen Mailversand in das Kommando reinbekommst...

Grüße
Reinerlein

MandelHL

Guten Morgen,

wieder einmal bin ich schwerst begeistert.

Danke rapster, danke Reinerlein.

Mit dem "scaler" hat es nun tatsächlich funtioniert.

Danke Euch beiden.

Viele Grüße
Mandel

Spartacus

Hallo zusammen,
nach gut einem halben Jahr Pause, habe ich heute auf einem raspi, den ich nur für Sonos Devices angeschafft habe, das Sonos Modul installiert.

Junge, Junge, das ist ja kein Vergleich mehr zur alten Version. Da gibt es ja so viel Neues, dass ich nicht weiß, wo ich anfangen soll!

Zunächst habe ich die Frage, was es mit diesen RG auf sich hat. Was soll hier angezeigt werden? Diese werden zwar alle automatisch angelegt, aber mehr passiert hier nicht! Ist bei mir etwas falsch, oder muss ich hier etwas konfigurieren? Sorry, aber ich habe es nicht geblickt!

Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

der-Lolo

#1460
Du musst die get funktionen noch ausführen
get sonosDEVICE favoritesWithCovers, playlistsWithCovers, RadioswithCovers...

am besten in einem at sodass auch aktualisiert wird wenn du mit dem Controller was veränderst.


Spartacus

#1461
Hallo
danke! 

Er zeigt mir jetzt alle Favourits, Radios oder Playlists des jeweiligen Sonosplayers an. Aber ich blicke einfach nicht, warum und wofür das gut sein soll! Sorry, bin noch zu weit weg vom Thema!
Christian

NACHTRAG:
Ich glaube ich habe es gerafft! Durch klicken auf das Icon in der RG wird der Radiosender umgeschaltet. Das habe ich gar nicht gemerkt! Den Klick auf das Symbol müsste man aber irgendwie in der RG sichtbar machen....
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hallo Spartacus,

ich habe die Dinger generieren lassen, damit Nutzer, die sich ein Dashboard für eine übersichtliche Steuerung geschaffen haben, einen einfachen Einstiegspunkt in diese Direktsteuerung haben.
Sozusagen, um zu sehen, mit welchen Mitteln man einfach was erreichen kann...
Klick auf das Symbol startet den jeweiligen Radiosender, Favorit oder die Playliste auf dem zugehörigen Player.

Aber ich gebe zu, dass ich das mal in der Doku erwähnen könnte :)

Das soll auch tatsächlich mehr als Vorlage zu verstehen sein, da das vermutlich nicht jedermanns Geschmack oder Anforderung treffen wird (und ja auch gar nicht kann).
Wenn man die nicht benutzen will, kann man sie auch einfach entfernen, die werden immer nur zusammen mit einem Sonosplayer-Device erzeugt...

Das automatische Erzeugen der Readings habe ich aus Performancegründen nicht direkt mit erzeugen lassen.
So hat das noch jeder selber in der Hand...

Grüße
Reinerlein

Spartacus

Hi Reiner,
null Problemo! Ich habe mich nur gewundert!
Ich muss mich auch erst wieder einarbeiten, ist sehr lange her, aber ich wollte das Sonos Modul nicht auf meinen Beleuchtungs-Pi hängen und habe ihm deshalb nen eigenen Rechner spendiert....
Da kann ich nun prima rumspielen und testen!

Danke für die vielen neuen Funktionen.....
bis bald,
Christian

Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

CQuadrat

Hallo Zusammen,

die Gerüchteküche behauptet, dass SONOS bald eine API für Drittanwendungen veröffentlichen will:

https://gigaom.com/2015/01/19/sonos-wants-to-launch-an-api-for-third-party-apps/


Vielleicht lässt sich da ja etwas für das SONOS-Modul ableiten.


Viele Grüße

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

Spartacus

Hallo,
bin gerade dabei meine Sonos Devices per fhem zu initialisieren!
Wenn die Geräte vom Netz getrennt waren, sollen Sie, je Typ, per Default mit Standardwerten geladen.
# Sonos initialisieren
# siehe 99_mySonosUtils.pm
#
define SonosInit notify Sonos_.*:.appeared  \
define Init_$NAME_Later at +00:02:00 \
{\
  my $reading =(ReadingsVal ("$NAME","playerType",""));;;;;;;;\
  if (($reading eq ("S1")) || ($reading eq ("S3")) || ($reading eq ("ZP120")))\
  {\
   if (ReadingsVal ("$NAME","currentTrackURI","") eq "")\
    {\
     SON_Init('$NAME', $reading)\
    }\
  }\
}
attr SonosInit disable 0
attr SonosInit group Sonos System
attr SonosInit room 98-Sonos
attr SonosInit sortby 1


mySonosUtils:
# Sound-Grundeinstellungen
#
sub SON_Init($$)
{
my ($player, $typ) = @_;
if ($typ eq "S1")
{
  {fhem "set $player LoadRadio WDR2%20Ruhrgebiet"}
  {fhem "set $player Volume 5"}
  {fhem "set $player Treble 10"}
  {fhem "set $player Bass 3"}
  {fhem "set $player Balance 0"}
  {fhem "set $player Loudness 1"}
  {fhem "set $player LEDState 0"}
}
if ($typ eq "S3")
{
  {fhem "set $player
......


Die Verzögerung von 2min habe ich eingebaut, weil die Geräte nach einem Neustart von fhem bzw.beim Einstöpseln des Sonos-Devices von fhem noch nicht vollständig erkannt wurden. Das klappt eigentlich auch ganz gut.

Nun möchte ich aber auch Gruppenkonfigurationen per Default einstellen, falls ein Gerät aus der Gruppenkonfiguration gerissen wird.

Dafür habe ich das hier gebaut:
define SonosSchlafzimmerGroup notify (Sonos_Schlafzimmer|Sonos_Bad):presence:.appeared \
define Init_SchlafzimmerGroup_Later at +00:05:00 \
{\
  if (ReadingsVal ("$NAME","currentTrackURI","") eq "") \
  {\
   fhem "set Sonos Groups [Sonos_Schlafzimmer, Sonos_Bad]"\
  }\
}


wenn Schlafzimmer bzw. Bad kurzfristig vom Netz getrennt werden, soll nach dem presence:.appeard die Gruppe wieder gebildet werden, wenn Sie nicht bereits existiert. CurrentTrackURI kann ich aber nicht nehmen, da dies zuvor mit dem Radiosender geladen wird. Wie kann ich erkennen, ob das Gerät bereits in der Gruppenkonfiguration ist? Mit SONOS get groups bekomme ich zwar alle Gruppen aufgelistet, aber diese dann zu zerlegen, ist nicht ganz einfach!(soll heißen: kriege ich nicht hin!)

Könnte man nicht für jeden Player ein Reading einbauen (z.B. CurrentGroupMaster und CurrentGroupMember)? Dann könnte man das recht easy abragen und die alte Gruppe wieder aufbauen, wenn die Werte leer sind weil eines der Geräte aus dem Verband gerissen wurde. Oder kann man das anders lösen?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hi Christian,

Sonos bietet nur ein paar Informationen dazu an:
- Das Reading "ZoneGroupID" des jeweiligen Players: Es enthält die ID des Zonemasters
- Das Reading "currentTrackURI" des jeweiligen Players: Es enthält bei einer Gruppenwiedergabe die RINCON-ID des Masters. Damit erkennt das Modul selbst die Wiedergabe und schreibt z.B. diesen Gruppenwiedergabetext hin...
- Das Reading "ZoneGroupState" des Sonos-Devices: Das ist die Grundlage für den Groups-Getter

Im Wiki gibt es unter den Beispielen (http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Beispiel_f.C3.BCr_die_Anzeige_der_Gruppenkonstellation_in_einer_ReadingsGroup) Perl-Code, den ich z.B. verwende, um die Gruppensituation auf der Oberfläche darzustellen (siehe Anhang).

Dort kannst du dir das zerlegen doch rausholen... es ist bei meinem pragmatischen Ansatz auch nicht schwer...
Da kann man sich schnell eine Prozedur schaffen, die einfach prüfen kann, ob zwei gegebene Playerdevices innerhalb derselben Gruppe stehen (sprich innerhalb einer []-Blocks):

sub sameGroup($$) {
my ($first, $second) = @_;
my $groups = CommandGet(undef, SONOS_getDeviceDefHash(undef)->{NAME}.' Groups');

while ($groups =~ m/\[(.*?)\]/ig) {
my @member = split(/, /, $1);

return 1 if (SONOS_isInList($first, @member) && SONOS_isInList($second, @member));
}
return 0;
}


@Christoph: Das mit der API wäre cool. Vieles muss man sich echt mühselig rauskramen und per Wireshark rumschnüffeln :) Es fehlen ja z.B. noch die Satellitenanbindung (das 5.1er System) im Modul...

Grüße
Reinerlein

KalleBlomquist

Hallo,

besteht die Möglichkeit die Logeinträge (s. Beispiel unten) im FHEM-Log zu reduzieren bzw. in ein eigenes Log zu schreiben ?
attr verbose 0 habe ich schon gesetzt.

VG


Beispiellog:
SONOS1: Event: Received ZoneGroupTopology-Event for Zone "Sonos_Flur".
2014.12.15 18:48:15 3: SONOS1: Event: End of ZoneGroupTopology-Event for Zone "Sonos_Flur".
2014.12.15 18:48:15 3: SONOS1: Event: Received Alarm-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: End of Alarm-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: Received Transport-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: End of Transport-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: Received DeviceProperties-Event for Zone "Sonos_Flur".
2014.12.15 18:48:15 3: SONOS1: Event: End of DeviceProperties-Event for Zone "Sonos_Flur".
2014.12.15 18:48:15 3: SONOS1: Event: Received ZoneGroupTopology-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: End of ZoneGroupTopology-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: Received Alarm-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: End of Alarm-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: Received Rendering-Event for Zone "Sonos_Flur".
2014.12.15 18:48:15 3: SONOS1: Event: End of Rendering-Event for Zone "Sonos_Flur".
2014.12.15 18:48:15 3: SONOS1: Event: Received DeviceProperties-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: End of DeviceProperties-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: Received ZoneGroupTopology-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: End of ZoneGroupTopology-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: Received Rendering-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: End of Rendering-Event for Zone "Sonos_Wohnzimmer".
2014.12.15 18:48:15 3: SONOS1: Event: Received DeviceProperties-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: End of DeviceProperties-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: Received Rendering-Event for Zone "Sonos_Bad".
2014.12.15 18:48:15 3: SONOS1: Event: End of Rendering-Event for Zone "Sonos_Bad".

Reinerlein

Hallo KalleBlomquist,

du brauchst dafür eigentlich nur das verbose-Attribut am Sonos-Device zu setzen (speichern nicht vergessen).
Danach musst du entweder einen Fhem-Restart durchführen, oder am Sonos-Device das disable-Attribut setzen, kurz warten, und wieder löschen. Das bewirkt einen Neustart des SubProzesses...

Grüße
Reinerlein

Spartacus

Zitat von: Reinerlein am 21 Januar 2015, 15:49:47
Hi Christian,

Sonos bietet nur ein paar Informationen dazu an:
- Das Reading "ZoneGroupID" des jeweiligen Players: Es enthält die ID des Zonemasters
- Das Reading "currentTrackURI" des jeweiligen Players: Es enthält bei einer Gruppenwiedergabe die RINCON-ID des Masters. Damit erkennt das Modul selbst die Wiedergabe und schreibt z.B. diesen Gruppenwiedergabetext hin...
- Das Reading "ZoneGroupState" des Sonos-Devices: Das ist die Grundlage für den Groups-Getter

Im Wiki gibt es unter den Beispielen (http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Beispiel_f.C3.BCr_die_Anzeige_der_Gruppenkonstellation_in_einer_ReadingsGroup) Perl-Code, den ich z.B. verwende, um die Gruppensituation auf der Oberfläche darzustellen (siehe Anhang).

Dort kannst du dir das zerlegen doch rausholen... es ist bei meinem pragmatischen Ansatz auch nicht schwer...
Da kann man sich schnell eine Prozedur schaffen, die einfach prüfen kann, ob zwei gegebene Playerdevices innerhalb derselben Gruppe stehen (sprich innerhalb einer []-Blocks):

sub sameGroup($$) {
my ($first, $second) = @_;
my $groups = CommandGet(undef, SONOS_getDeviceDefHash(undef)->{NAME}.' Groups');

while ($groups =~ m/\[(.*?)\]/ig) {
my @member = split(/, /, $1);

return 1 if (SONOS_isInList($first, @member) && SONOS_isInList($second, @member));
}
return 0;
}


@Christoph: Das mit der API wäre cool. Vieles muss man sich echt mühselig rauskramen und per Wireshark rumschnüffeln :) Es fehlen ja z.B. noch die Satellitenanbindung (das 5.1er System) im Modul...

Grüße
Reinerlein
Hallo Reiner,
vielen Dank für Deine ausführliche Antwort. Ich konnte mir das noch nicht angucken, da ich heute ein anderes Problem mit meinem Beleuchtungs-Fhem hatte....

Vielen Dank,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R