FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: djhans am 28 Februar 2014, 21:51:25

Titel: umfangreiche Stringoperationen
Beitrag von: djhans am 28 Februar 2014, 21:51:25
Hallo,
ich brauche Hilfe und komme nicht weiter:
Ich möchte einen String in mehrere Teile zerlegen um abhängig vom Ergebnis mit readigsGroup zu visualisieren-

Hier ein Beispiel des Strings:
[Buero], [Schlafzimmer, Schlafzimmer_??, Bad], [Terrasse], [Wohnzimmer, Wohnzimmer_??]
Dieser String kann sich permanent ändern. Die Grundstruktur bleibt aber immer gleich. Jeder Raum
kommt nur 1 x vor. Die Kombinationsänderung wird über ein Event signalisiert, den man dann mit einem
"get <Devicename> Groups" auslesen kann. Alle Räume können in einem Klammerbereich "[]" stehen;
jeder Raum kann auch separat eingeklammert sein.


Für die Visualisierung soll fogende Regeln gelten:

Wenn in den [] nur ein Raum enthalten ist, soll dieses Device der Gruppe 1 zugeordnet werden.
Räume mit _?? (?? steht für beliebige Zeichen) werden ignoriert. Die Devices in dieser Gruppe haben
Readings die dann dort visualisiert werden sollen

Wenn in [] mehrere, durch Komma getrennte Räume enthalten sind, dann werden diese Räume der
Gruppe2 zugeordnet. Dabei gilt ebenfalls, dass Räume mit _?? ignoriert wrden. Das erste Device in den
eckigen Klammern ist der Master. Nur für den Master werden dann in diesr Gruppe Readings visualisiert. Die
anderen "Teilnehmer" zeigen keine Visualisierung an.

Im Ergebnis sieht das für das o.a. Bsp so aus:
define Gruppe1 readingsGroup (Büro, Terrasse, Wohnzimmer)
define Gruppe2 readingGroups (Schlafzimmer, Bad)


So, das ist es! Mit "split" unter perl kann man den String zerlegen, aber wenn ich auf das Komma abfrage,
kriege ich zwar die Teilnehmer aber die "Gruppeninfo" der Devices in den eckigen Klammern, geht verloren.
Außerdem wird mir teilweise die eckige Klammer zurückgeliefert....

Kann jemand unterstützen? Meine perl Kenntnisse sind noch auf dem Niveau eines 2jährigen...würde aber gerne die Visualisierung
aufbauen....

Danke unf Gruß,
Christian
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: betateilchen am 28 Februar 2014, 22:07:23
regexp heißt das Zauberwort... Aber beginnen wir mal einfach und hoffentlich logisch nachvollziehbar:

[Buero], [Schlafzimmer, Schlafzimmer_??, Bad], [Terrasse], [Wohnzimmer, Wohnzimmer_??]

Erster Schritt:

Du splittest nicht nach "," sondern nach "], [" dann bekommst Du 4 Teilstrings in einem Array, mit folgenden Elementen:

string1: [Buero
string2: Schlafzimmer, Schlafzimmer_??, Bad
string3: Terrasse
string4: Wohnzimmer, Wohnzimmer_??]

Nächster Schritt:
Du entfernst per regexp in allen Strings die eckigen Klammern (entfernen heißt dabei "durch nix ersetzen"), Doku zu regexp gibts im Internet massig

Nächster Schritt:
Du splittest jeden String anhand von "," wieder in ein Array und bekommst

aus string1 ergibt sich ein Array mit einem einzigen Element: Buero
aus string2 ergibt sich ein Array mit drei Elementen
aus string3 ergibt sich ein Array mit einem Element
aus string4 ergibt sich ein Array mit zwei Elementen

jedes dieser Arrays wird nach seiner Erzeugung geprüft:
1. alle Einträge, die ein _ enthalten, werden gelöscht
2. alle Einträge aus Arrays mit exakt einem Element gehen in die Gruppe 1
3. alle Einträge aus Arrays mit mehreren Elementen gehen in die Gruppe 2

Fertsch.

(an alle Entwickler: ich weiss, dass das noch mit viel weniger Aufwand, aber ein Programmierungs-Einsteiger sollte die Logik verstehen)
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: justme1968 am 28 Februar 2014, 22:11:50
ich wollte dir gerade im anderen thread ein paar fragen stellen :)

ich denke es wäre geschickt noch mal einem schritt zurück zu machen und zu überlegen was das ergebniss sein soll bevor es um das aufsrössseln von strings geht.

warum möchtest du zwei readingsGroupa? bzw. wofür ist sie zweite?

reicht nicht eine die z.b. pro zeile eine aktive Gruppe anzeigt.

warum brauchst du die device ebene in der readingsGroup? reicht es nicht auf gruppen ebene zu steuern? egal wer gerade in den gruppen ist.

gruss
  andre
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: hexenmeister am 28 Februar 2014, 22:28:36
ich habe auch den zweck nicht verstanden. Ich würde die Sache zu vereinfachen versuchen.

Teilen könnte man das ungefähr so:

my $t="[Buero], [Schlafzimmer, Schlafzimmer_??, Bad], [Terrasse], [Wohnzimmer, Wohnzimmer_??]";; my @a=split(/\[([^\]]+)\]/, $t);;

Ergebnis:
Buero
,
Schlafzimmer, Schlafzimmer_??, Bad
,
Terrasse
,
Wohnzimmer, Wohnzimmer_??


etwas grüselig, oder? ;)

P.S. Man könnte bestimmt auch die Kommas außerhalb von Klammern bestimmt auch ausfiltern, aber RegExp dürfte dann monströs sein. Nicht am späten Abend ;)
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: justme1968 am 28 Februar 2014, 22:38:00
der teil ist eigentlich der einfachste :)

nur an kommas splitten und dann so lange elemente wieder zusammenfassen wie keine keine schließende klammer am ende ist. ein split und zwei schleifen mit einem shift in der inneren.

gruss
  andre
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: hexenmeister am 28 Februar 2014, 22:44:20
mit den schleifen ist es sicherlich besser verständlich, als mit RegExp ;)
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 28 Februar 2014, 23:17:37
Hallo zusammen,
hier noch einmal der Zweck des Ganzen: Ich dachte, ich hätte es halbwegs verständlich rübergebracht

Ich versuche es noch einmal:
Ich habe mehrere Sonos Player in verschiedenen Räumen.

Die StandAlonePlayer Player, also alle Räume, die separat mit Mucke versorgt werden, werden in einem "Kasten" oder Gruppe zusammen visualisiert. Jede Zeile enthält den Player mit Name des Players, Status (Play Stop, Pause), Radio/AlbumInfo, und was gerade gespielt wird..

Die Player, die in einer Gruppenkonstellation spielen (also z.B. "Schlafzimmer und Bad" sowie "Büro und Keller und Küche" ) werden je in einem eigenen Kasten visualisiert. Hier wird der Gruppenführer in Zeile 1 mit den o.a. Readings dargestellt, die Gruppenmittglieder tauchen nur mit dem Playername in Zeile 2 bzw. in Zeile 2+3 auf.

Das hat den Sinn, dass man direkt erkennen kann, welche Player in welchen Gruppen spielen bzw. im Singlebetrieb arbeiten. Dieses Zusammenspiel zwischen Gruppe/StandAlone kann dynamisch über den Sonos-Controller geändert werden. So können die SinglePlayer auch anderen Gruppen hinzugefügt werden oder es können Gruppenmitglieder aus dem Gruppenverband wieder herausgelöst werden.


Das Sonos-Modul liefert keine brauchbaren Readings für Gruppenmittglieder. Deshalb macht es keinen Sinn, diese Readings zu visualisieren. Der Master führt hier Regie....

Das Gleiche gilt für Stereopaare. Zwei Single-Player können über den Sonos-Controller zu einem Stereopaar zusammengefasst werden. Hier liefert das Device, welches dann den rechten Stereokanal bildet, keine brauchbaren Readings. Erkannt werden diese Devices anhand des besagten _?? (hier ist ??=RF). Deshalb sollte man diesem Device auch keine eigene Zeile in der Visualisierung verpassen. Witzig wäre es natürlich, wenn man im Stereobetrieb einfach 2 DeviceIcons anzeigt.

Das gleiche gibt für den Subwoofer. Der wird mit _SW bezeichnet und kann einem Player /Stereopaar als zusätzlicher Bass hinzugefügt werden. Auch hier gilt, das dieser keine brauchbaren Readings liefert und an den entsprechenden Raumnamen (ohne _SW) gekoppelt ist.

So, ich hoffe, es ist nun klar geworden. Die technischen Details habe ich ja schon weiter oben erläutert. Umsetzbar ist das sicherlich, die frage ist nur, wie man das macht....

Danke für die Geduld,
ich hoffe auf Unterstüzung,
Christian.

NACHTRAG:
@hexenmeister: Das ist ja der Hammer! Das habe ich ja noch nie gesehen...Damit kann man bestimmt nen Wettbewerb gewinnen...echt irre! Das probiere ich mal aus..
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: betateilchen am 28 Februar 2014, 23:20:52
Zitat von: djhans am 28 Februar 2014, 23:17:37
Danke für die Geduld,
ich hoffe auf Unterstüzung,

äh... suchst Du wirklich Unterstützung oder doch eher eine copy&paste-fähige Lösung?

Unterstützung gabs jedenfalls schon jede Menge hier in den wenigen Antworten.
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 28 Februar 2014, 23:24:48
@betateilchen:
...ja das habe ich gesehen!  Ist alles passiert, während ich den langen Erklärungstext getippt habe...ich sollte doch den Sinn und Zweck des Ganzen noch mal erläutern...

Danke für die Unterstützung.....

Titel: Antw:umfangreiche Stringoperationen
Beitrag von: justme1968 am 28 Februar 2014, 23:25:57
noch mal meine frage: warum mehr als eine readingsGroup?

der unterschied zwischen Gruppen mit nur einem player und solchen mit zwei playern ist doch nur die zusätzliche infozeile mit der liste der beteiligten player.

alles in einer tabelle zu zeigen hat den vorteil das du nicht dynamisch neue readingsGroup devices anlegen musst wenn sich deine player gruppen ändern. das wird unhandlich für einen einsteiger.

eine einzige readingsGroup die eine dynamische anzahl zeilen hat ist dagegen einfach.

gruss
  andre

Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 28 Februar 2014, 23:35:28
Hi,
Zitat von: justme1968 am 28 Februar 2014, 23:25:57
noch mal meine frage: warum mehr als eine readingsGroup?

der unterschied zwischen Gruppen mit nur einem player und solchen mit zwei playern ist doch nur die zusätzliche infozeile mit der liste der beteiligten player.

Das stimmt! Aber wie kann ich dann auf einen Blick erkennen, welche Player in einer Gruppe und welche im Singlebetrieb spielen. Wie kann ich die Gruppen optisch hervorheben?

Gruppe Singel:
Wohnzimmer: <stop>
Bad: <Play>    <WDR2>     <RDS-TExt>
Büro: <Play>  <NDR>   <RDS-TExt>
Terrasse: <Play>  <Charts 2014>  <Lieder...>


Gruppe  Musik 1
Schlafzimmer: <Play> <WDR2> <RDS-TExt>
Kinderzimmer:
DAchboden:

Gruppe Musik2:
Keller: <Play> <SWR3> <RDS-TExt>
Küche:
Kinderzimmer2

Wenn man das in einen Kasten kriegt, wäre das auch ok!
djhans
Titel: umfangreiche Stringoperationen
Beitrag von: justme1968 am 28 Februar 2014, 23:40:28
du baust ein notify auf das reading das sich ändert wenn sich die gruppierung ändert. da parst du den string und änderst mit einem modify deine readingsGroup. auf einem blick erkennst du das z beispiel an der alternierenden zeilen farbe. dir würde dann pro gruppe und nicht pro zeile wechseln.

wenn das nicht reicht kannst du die formierung und den style so weit beeinussen bis es dir gefällt.

du kannst unter anderem mit farben, einrücken, zwischenüberschriften und abständen arbeiten.

gruss
  andre
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 28 Februar 2014, 23:53:25
Hallo,
ok.  Das heißt, damit ist der Weg schon mal klar! Alles in eine readingsGroup. Der Grundaufbau ist dann, alle Player als Einzelplayer mit allen Readings in eine readingsGroup, richtig? Dann mit modify ändern, wenn das notify kommt...

Dann fange ich mal mit dem Zerstückeln des Strings an....

Vielen Dank,
Christian
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 05 März 2014, 17:03:23
Hallo,
hier mein Ergebnis zu den Stringoperationen: Das Ganze sieht in fhem nun so aus:

in der myutil:
sub
SplitGroups($)
{
  my ($str) = @_;
  my @data = map { s/[^,]+(_SW|_RF)//g; s/^,|,$//g; s/,,/,/g; $_}
  $str =~ m{\[([^\]]+)\]}g;
  return (@data);


aufgeruden wird das Ganze mit:
my @x = SplitGroups (fhem("get Sonos Groups"))

set Sonos Groups liefert diesen String:
[Sonos_Buero], [Sonos_Schlafzimmer, Sonos_Schlafzimmer_RF, Sonos_Bad], [Sonos_Terrasse], [Sonos_Wohnzimmer, Sonos_Wohnzimmer_SW]

In x sieht das dann so aus:
x1:Sonos_Buero
x2:Sonos_Schlafzimmer, Sonos_Bad
x3:Sonos_Terrasse
x4: Sonos_Wohnzimmer

und das sind jetzt genau die Device-Namen, die mit readingsGroup weiterverarbeitet werden sollen.

@justme1968:
ich verstehe immer noch nicht, wie ich das in einer readingsGroup optisch trennen kann. Wenn ich die Devices in eine "Gruppe" packe, dann stehen die doch alle untereinander (siehe Bild) und man erkennt nicht, dass Schlafzimmer + Bad zusammengefasst sind.  Wie trenne ich das optisch am Besten ab.

djhans

djhans.
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: justme1968 am 05 März 2014, 17:11:00
in dem du die devices die zusätzlich zu einer gruppe gehören nicht als eigene devices in der readingsGroup definierst sondern als zusätzliche readings die zum gruppen master gehören.

also z.b. mit ...<br>,<><%iconSONOSPLAYER_icon-S1>,<Bad> ans ende der Schlafzimmer Zeile.

gruss
  andre
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 05 März 2014, 20:58:35
Hallo,
ok!  Du verwendest <br> für Zeilenumbruch. Sorry für die doofe Frage: Woher weiß ich, welche Code-tags ich hier benutzen kann. <br> alleine reicht nicht! Der Cursor muss an den Zeilenanfang springen....
Kann man das für fhem generell beantworten, oder sind die codetags modulspezifisch.

Danke,
djhans
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: justme1968 am 05 März 2014, 21:04:16
schau in die commandref. das <br> in diesem beispiel ist modulapezifisch. mit etwas handarbeit kannst du im prinzip fast alles verwenden so lange du dich innerhalb des tabellen layout bewegst. wenn du etwas ganz anderes möchtest passt readingsGroup nicht mehr. aber ich denke das es passen sollte. o

wenn du an den zeilenanfang springen willst musst du dafür sorgen das sie spalte davor leer ist. das sollte bei dem beispiel eigentlich so sein.

schau mal  im wiki. da gibt es einige readingsGroup beispiele.

gruss
  andre

Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 05 März 2014, 21:40:11
Hi Andre,
hm! Habe das <br> in der commandref wohl überlesen....
Im Wiki gibt es nichts Passendes! Da habe ich schon geguckt. Offenbar liegt der Versatz am Icon vor dem Namen. Schau mal in die Screenshots. Auch der Zeilenabstand wird dadurch wohl beeinflusst...da kann man wohl nix machen....muss ich mir noch mal Gedanken machen.....

Christian



Titel: Antw:umfangreiche Stringoperationen
Beitrag von: justme1968 am 05 März 2014, 21:47:45
der zeilenabstand (und auch dir spaltenbreit) hängt jeweils vom größten element ab.

eine zeile ohne icon ist dann natürlich flacher. entweder verwendet du immer icons oder arbeitest mt den styles.

die eingerückte zeile würde ich jetzt als strukturierung absichtlich verwenden. aber sie ist auf jeden fall weg zu  bzw. unscheinbar schmal zu bekommen.

der knackpunkt ist das es halt eine tabelle ist sie zugrunde liegt. da musst du alles rein bekommen.

du kannst aber elemente habe. die mehr als eine Spalte überspannen.

ich schaue aber noch mal warum das <br> nicht in die aller erste spalte springt.

gruss
  andre
Titel: Antw:umfangreiche Stringoperationen
Beitrag von: djhans am 05 März 2014, 21:59:55
...das springt schon in die erste Spalte, aber nur, wenn ich das Symbol weglasse!

djhans