Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

Begonnen von Otto123, 31 Mai 2020, 18:30:55

Vorheriges Thema - Nächstes Thema

Otto123

#840
Das mit den anderen Befehlen funktioniert glaube ich so (zumindest sieht es so aus):
my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
if (grep { $_ eq $cmd } keys %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}
Möge mich einer der es besser weiß korrigieren ;)

@Thomas Danke für die Idee.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#841
my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
if (grep { $_ eq $cmd } keys %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}


Mir mags nicht gelingen, klappt das bei dir ?

Was hältst du von etwas Formatierung, der Lesbarkeit wegen ?


##############################################
# $Id: 99_sonos2mqttUtils.pm
# from myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
# utils for sonos2mqtt Implementation
# They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub sonos2mqttUtils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.

sub sonos2mqtt {
my ($NAME,$EVENT)=@_;
my @arr = split(' ',$EVENT);
my ($cmd,$vol,$text,$value);
$cmd = $arr[0];
my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
my $uuid = ReadingsVal($NAME,'uuid','error');
my $payload = $EVENT;
my @a=('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');

if (grep { $_ eq $cmd } @a)
{return qq(sonos/$uuid/control { "command": "$cmd" })};

my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');

if (grep { $_ eq $cmd } keys %t)
{return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })};

if($cmd eq 'notify')
{return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}

if($cmd eq 'x_raw_payload')
{return qq(sonos/$uuid/control $payload)}

if($cmd eq 'mute')
{$value = $payload eq "true" ? "mute" : "unmute";
return qq(sonos/$uuid/control { "command": "$value" } )}

if($cmd eq 'input')
{$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue";
return qq(sonos/$uuid/control { "command": "switchto$value" } ) }

if($cmd eq 'leaveGroup')
{$value = ReadingsVal($uuid,"groupName","all");
return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }

if($cmd eq 'playUri')
{fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}

if($cmd eq 'sayText')
{($cmd,$text) = split(' ', $EVENT,2);
fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}

if($cmd eq 'speak')
{($cmd,$vol,$text) = split(' ', $EVENT,3);
fhem("set $tts tts $text;sleep $tts:playing:.0;set $NAME notify $vol [$tts:httpName]")}

if($cmd eq 'playFav') {
use JSON;use HTML::Entities;use Encode qw(encode decode);
my $enc = 'UTF8';
my $uri='';my $search=(split(' ', $EVENT,2))[1];
$search=~s/[\/()]/./g;
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
my @array=@{$decoded->{'Result'}};
foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
{$uri = $_->{'TrackUri'} }
};
fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'devStateIcon')
{return sonos2mqtt_devStateIcon($NAME)}

if($cmd eq 'test')
{Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}


Das es geht hab ich festgestellt, aber ich frag mich trotzdem ob es richtig ist nach einem if die ; wegzulassen ?

Otto123

ZitatMir mags nicht gelingen, klappt das bei dir ?
Ich habe das gestern Abend genau so eingebaut und das funktioniert so bei mir.

Das man Blöcke bei Perl nicht mit ; abschließen muss, habe ich bei meinen ersten Gehversuchen mit Perl mal "hart" gelernt und halte das konsequent ein. Da ich gern in der Kommandozeile teste, ist für mich jedes Semikolon zu viel ein doppeltes ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ich kann weiterhin keine Lautstärke setzen mit volume auch wenn ich deinen Code aus Github verwende, klappt das bei dir ?

setAVTUri klappt, joinGroup mein ich kann ich nicht testen (hab ich mich bisher nicht beschäftigt) weil ich nur einen Player habe.

sub sonos2mqtt
{
my ($NAME,$EVENT)=@_;
my @arr = split(' ',$EVENT);
my ($cmd,$vol,$text,$value);
$cmd = $arr[0];

if($cmd eq 'devStateIcon') {return sonos2mqtt_devStateIcon($NAME)}
if($cmd eq 'sayText') { ($cmd,$text) = split(' ', $EVENT,2)}
if($cmd eq 'speak') { ($cmd,$vol,$text) = split(' ', $EVENT,3)}
my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
my $uuid = ReadingsVal($NAME,'uuid','error');

my $payload = $EVENT;
if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //}

my @test = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
if (grep { $_ eq $cmd } @test) {return lc( qq(sonos/$uuid/control { "command": "$cmd" }) )}

my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
if (grep { $_ eq $cmd } %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}

if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}
if($cmd eq 'x_raw_payload') {return qq(sonos/$uuid/control $payload)}

#%t=('true'=>'mute','false'=>'unmute');
#if($cmd eq 'mute')   {return qq(sonos/$uuid/control { "command": "$t{$payload}" } )}
if($cmd eq 'mute')   {$value = $payload eq "true" ? "mute" : "unmute"; return qq(sonos/$uuid/control { "command": "$value" } )}
#%t=('TV'=>'tv','Line_In'=>'line','Queue'=>'queue');
#if($cmd eq 'input')  {return qq(sonos/$uuid/control { "command": "switchto$t{$payload}" } ) }
if($cmd eq 'input')  {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }

if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }

if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}
if($cmd eq 'sayText') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
if($cmd eq 'speak') {fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}
if($cmd eq 'playFav') {
use JSON;use HTML::Entities;use Encode qw(encode decode);
my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
$search=~s/[\/()]/./g;
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
my @array=@{$decoded->{'Result'}};
foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                   {$uri = $_->{'TrackUri'} }
    };
fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}


attr Sonos_Wohnzimmertest setList stop:noArg {sonos2mqtt($NAME,$EVENT)}\
play:noArg {sonos2mqtt($NAME,$EVENT)}\
pause:noArg {sonos2mqtt($NAME,$EVENT)}\
toggle:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeUp:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeDown:noArg {sonos2mqtt($NAME,$EVENT)}\
volume:slider,0,1,100,5 {sonos2mqtt($NAME,$EVENT)}\
mute:true,false {sonos2mqtt($NAME,$EVENT)}\
next:noArg {sonos2mqtt($NAME,$EVENT)}\
previous:noArg {sonos2mqtt($NAME,$EVENT)}\
joinGroup:textField {sonos2mqtt($NAME,$EVENT)}\
leaveGroup:noArg {sonos2mqtt($NAME,$EVENT)}\
setAVTUri:textField {sonos2mqtt($NAME,$EVENT)}\
playUri:textField {sonos2mqtt($NAME,$EVENT)}\
input:Queue,TV {sonos2mqtt($NAME,$EVENT)}\
notify:textField {sonos2mqtt($NAME,$EVENT)}\
x_raw_payload:textField {sonos2mqtt($NAME,$EVENT)}\
sayText:textField {sonos2mqtt($NAME,$EVENT)}\
speak:textField {sonos2mqtt($NAME,$EVENT)}\
test:textField {sonos2mqtt($NAME,$EVENT)}

Otto123

#844
Ja Mist: unzureichenden getestet. Ich hatte es gestern abend noch gesehen, aber gedacht es funktioniert:
"$payload" bei den Strings ->  $payload bei den Zahlen.

Das wäre jetzt hier wieder ne Ausnahme in dem Dreiergespann, dann macht das mMn keinen Sinn. Dann ist der ursprüngliche Konstrukt genauso lang und simpler :) Auch wenn es mit dem hash "anspruchsvoller" ist ;)
Ich lass es mal als Kommentar drin, vielleicht braucht man es noch :)
if($cmd eq 'volume') {$ret = qq(sonos/$uuid/control { "command": "volume", "input": $payload })}

#my %t=('joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
#if (grep { $_ eq $cmd } %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}

if($cmd eq 'joinGroup') {$ret = qq(sonos/$uuid/control { "command": "joingroup",  "input": "$payload"})}
if($cmd eq 'setAVTUri') {$ret = qq(sonos/$uuid/control { "command": "setavtransporturi",  "input": "$payload"})}

Wenn Du im GitHub weiter unten schaust habe ich das hash Konstrukt noch bei den "? w:f " Schlangen mal versucht. Es bringt auch auch keine Übersichtlichkiet und ist glaube ich sogar ungenauer als der Vergleich. 

Ergänzung: bei meinem/unserem Code von #837 war noch die Einfügung von lc() entscheidend - sonos2mqtt wil volumeup und nicht volumeUp  ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#845
Nochmal eine andere Variante.

Machts nicht kürzer sondern länger und obs übersichtlicher/simpler ist wsl. Ansichtssache.

Ich würd jetzt aber trotzdem gerne wissen warum playUri und die anderen restlichen Befehle wenn man sie erweitern wollte nicht klappt/klappen.

Was ist an der Definition von $pU falsch ?

Ein
Zitat{return fhem("set Sonos_Wohnzimmertest setAVTUri x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0;; sleep 1;; set Sonos_Wohnzimmertest play")}
klappt zumindest auch aus der Kommandozeile auch ?

Zitatsub sonos2mqtt
{
   my ($NAME,$EVENT)=@_;
   my @arr = split(' ',$EVENT);
   my ($cmd,$vol,$text,$value);
   $cmd = $arr[0];
   my $payload = $EVENT;
   if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //};
   $value = $payload eq "true" ? "mute" : "unmute";
   my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
   my $uuid = ReadingsVal($NAME,'uuid','error');

   my $dSI = sonos2mqtt_devStateIcon($NAME);
   my $v = qq(sonos/$uuid/control { "command": "$cmd", "input": $payload });
   my $jG = qq(sonos/$uuid/control { "command": "joingroup", "input": "$payload" });
   my $sAU = qq(sonos/$uuid/control { "command": "setavtransporturi", "input": "$payload" });
   my $x_raw_payload = qq(sonos/$uuid/control $payload);
   my $m = qq(sonos/$uuid/control { "command": "$value" } );
   #my $pU = qq(fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play"));

   my $pU = fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play");

   my @test = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
   if (grep { $_ eq $cmd } @test) {return lc( qq(sonos/$uuid/control { "command": "$cmd" }) )}

my %sl1name2cmnd = (
   devStateIcon => "$dSI",
   volume => "$v",
   mute => "$m",
   joinGroup => "$jG",
   setAVTUri => "$sAU",
   playUri => "$pU",
   x_raw_payload => "$x_raw_payload"
   );
   my $sl1cmnd = %sl1name2cmnd{$cmd};
      return $sl1cmnd;

      
#if($cmd eq 'sayText') { ($cmd,$text) = split(' ', $EVENT,2)}
#if($cmd eq 'speak') { ($cmd,$vol,$text) = split(' ', $EVENT,3)}
#my $notify = qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":#100,"volume":$arr[1],"delayMs":700}});
#my $sayText = ($cmd,$text) = split(' ', $EVENT,2);fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set #$tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text");
#my $speak = ($cmd,$vol,$text) = split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]");


#if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}
#if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}

if($cmd eq 'sayText') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
if($cmd eq 'speak') {fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}

if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }
if($cmd eq 'input')  {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }
if($cmd eq 'playFav') {
   use JSON;use HTML::Entities;use Encode qw(encode decode);
   my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
   $search=~s/[\/()]/./g;
   my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
   my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
   my @array=@{$decoded->{'Result'}};
   foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                      {$uri = $_->{'TrackUri'} }
          };
         fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}

Hast du trotzdem eine Idee ?

edit:

Achso, mit

my $pU = qq(fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play"));
my $pU = q(fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play"));
my $pU = 'fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")';


klappts nicht.

Mit

my $pU = "fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")";

gibts 100% CPU-Auslastung

Otto123

ich habe jetzt ganz bewusst nicht alles sondern nur das Rote gelesen.
Das kann nicht funktionieren: return gibt einen topic mit payload zurück und MQTT2 verarbeitet das.
Im Falle: wir führen irgendwelchen Code aus, muss MQTT2 ein undef bekommen und macht selbst nichts!

Also return undef! Wenn "irgendein" Befehl ausgeführt wird und MQTT2 nichts davon wissen soll.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Danke, hab etwas gebraucht um zu verstehen, hab ich aber jetzt.

Bin gespannt ob und was mir dazu vlt. einfällt  ;D

Otto123

Wenn wir mit dem Ding hier "nichts mehr zu tun haben", will ich Rudi fragen ob man die setList nicht auch im ' vorderen Teil ' dynamisch machen kann. Derzeit trau ich mir das noch nicht :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Einmal noch heute.

Dann sollte doch aber die Definition von $n->notify möglich sein/ausgeführt werden ?

Will nämlich nicht, an was liegts hier ? Das der Zugriff auf die Elemente nochmal zusätzlich in {} erfolgt ? Komm nicht drauf.

Zitatsub sonos2mqtt
{
   my ($NAME,$EVENT)=@_;
   my @arr = split(' ',$EVENT);
   my ($cmd,$vol,$text,$value);
   $cmd = $arr[0];
   my $payload = $EVENT;
   if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //};
   $value = $payload eq "true" ? "mute" : "unmute";

   my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
   my $uuid = ReadingsVal($NAME,'uuid','error');

   my $dSI = sonos2mqtt_devStateIcon($NAME);
   my $jG = qq(sonos/$uuid/control { "command": "joingroup", "input": "$payload" });
   my $m = qq(sonos/$uuid/control { "command": "$value" } );
   my $n = qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":#100,"volume":$arr[1],"delayMs":700}});
   my $sAU = qq(sonos/$uuid/control { "command": "setavtransporturi", "input": "$payload" });
   my $v = qq(sonos/$uuid/control { "command": "$cmd", "input": $payload });
   my $xrp = qq(sonos/$uuid/control $payload);
   
   my @test = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
   if (grep { $_ eq $cmd } @test) {return lc( qq(sonos/$uuid/control { "command": "$cmd" }) )};
      
   my %sl1name2cmnd = (
      devStateIcon => "$dSI",
      joinGroup => "$jG",
      mute => "$m",
      notify => "$n",
      setAVTUri => "$sAU",
      volume => "$v",
      x_raw_payload => "$xrp"
   );
   my $sl1cmnd = %sl1name2cmnd{$cmd};
      return $sl1cmnd;
      
#if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}

#my $sayText = ($cmd,$text) = split(' ', $EVENT,2);fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set #$tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text");
#my $speak = ($cmd,$vol,$text) = split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]");
#if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}

if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }
if($cmd eq 'input')  {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }
if($cmd eq 'playFav') {
   use JSON;use HTML::Entities;use Encode qw(encode decode);
   my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
   $search=~s/[\/()]/./g;
   my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
   my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
   my @array=@{$decoded->{'Result'}};
   foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                      {$uri = $_->{'TrackUri'} }
          };
         fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}

Otto123

Blöde Frage aber warum ist da ein Doppelkreuz?
"timeout":#100
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Unglaublich, das wars. Thx

Hatte ich mich auch schon gefragt, war der Meinung das kam so aus deinem Code und mir nichts dabei gedacht, hat sich irgendwie eingeschlichen.

m8ichael

Zitat von: Otto123 am 09 Dezember 2020, 17:18:16
Hallo Thomas,

ich glaube dein Problem ist jetzt:
Du hast alles als Pi gemacht, der Prozess startet jetzt auch mit user pi - aber manches hast Du mit sudo gemacht?
Der pm2 kann praktisch in jedem User Kontext separat laufen (ihr könnt mich schlagen wenn das nicht stimmt - ich hatte es geschafft das alles doppelt lief)
Schau mal pm2 läuft als user fhem, als user pi und als user root sehe ich nix:
pm2 list
[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $ sudo -u fhem pm2 list
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 20737    │ 21D    │ 0    │ online    │ 0%       │ 52.8mb   │ fhem     │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $ sudo pm2 list
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $

Ich werde aber deinen Prozess nochmal durchspielen, offenbar fehlt ja was in der Doku :)

Hi,

ich habe die Doku 1:1 durchgespielt, es allerdings noch nicht geschafft, s2m per pm2 zu starten. Egal, welchen User ist nutze, die o. a. Liste ist stets leer. Hat jemand einen Tipp, wie vorzugehen ist? Habe bereits nodejs komplett neu installiert, aber keine Änderung...

Ganz generell funktioniert s2m (auch in FHEM), aber eben nicht per Aufruf durch pm2...

Viele Grüße

Michael

Otto123

#853
Hallo Michael,

was bedeutet das es läuft, wie läuft es denn?

Ich vermute mal Du hast ALLES abgearbeitet?  ???

Wenn alles Standard ist - ist weiter nichts als:
(nodejs schon installiert)
Im System
sudo npm install -g sonos2mqtt

Diesen Code in FHEM Raw Definition ausführen (vorher nur NameDesVorhandenenMQTT2Servers richtig ändern!):
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev NameDesVorhandenenMQTT2Servers
attr SonosBridge room MQTT2_DEVICE
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Wenn Du dann im System das eingibst, solltest Du den Prozess laufen sehen
sudo -u fhem pm2 list
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

m8ichael

Hallo Otto,

Zitat von: Otto123 am 23 Februar 2021, 12:46:44
Hallo Michael,

was bedeutet das es läuft, wie läuft es denn?

Ich vermute mal Du hast ALLES abgearbeitet?  ???

Wenn alles Standard ist - ist weiter nichts als:
(nodejs schon installiert)
Im System
sudo npm install -g sonos2mqtt

Diesen Code in FHEM Raw Definition ausführen (vorher nur NameDesVorhandenenMQTT2Servers richtig ändern!):
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev NameDesVorhandenenMQTT2Servers
attr SonosBridge room MQTT2_DEVICE
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Wenn Du dann im System das eingibst, solltest Du den Prozess laufen sehen
sudo -u fhem pm2 list

Ja, wenn ich auf in der shell s2m starte, dann funktioniert alles, d. h., FHEM kann die Verbindung zu den SONOS-Geräten herstellen etc. Problem ist nur, dass der Start von s2m per pm2 nicht funktioniert, d.h., die Prozessliste per

sudo -u fhem pm2 list

ist leer. Egal, ob ich pm2 unter pi, root oder auch fhem starte. Irgendwie funzt pm2 halt nicht...