[GELÖST] get Abfrage aus monitoring Modul wird nicht von Echo wiedergegeben

Begonnen von Wolle02, 05 April 2020, 17:42:02

Vorheriges Thema - Nächstes Thema

TomLee

Hab mir mal so ein monitoring-Device definiert.

Wenn ich das get zuvor in ein Reading schreibe, um zu testen ob das Reading über den Echo ausgegeben wird, passiert auch nichts.

du_t1 {if (ReadingsVal("Fenster_monitoring","allCount","") > 0) {
my $status=fhem("get Fenster_monitoring all");
fhem("setreading Fenster_monitoring test $status");
my $status2=ReadingsVal("Fenster_monitoring","test","");
fhem("set EG_Echo_Kueche speak $status2")}}


Sehe aber in der test Readingzeile über und unter dem Inhalt einen Abstand nach oben und unten.(s. Bild im Anhang)

Dachte mir das sind eventuell newlines und die gehören einfach entfernt:

du_t1 {if (ReadingsVal("Fenster_monitoring","allCount","") > 0) {
my $status=fhem("get Fenster_monitoring all");
$status =~ s/\n$//g;
fhem("setreading Fenster_monitoring test $status");
my $status2=ReadingsVal("Fenster_monitoring","test","");
fhem("set EG_Echo_Kueche speak $status2")}}


Aber das ändert auch nichts, es gibt weiterhin den Abstand im Reading test.

Wenn es keine newlines sind was ist es denn dann, was da vom get zurückgegeben wird und vor der Übergabe an den speak Befehl mglw. entfernt gehört ?

Gruß

Thomas

nils_

vermutlich deswegen:

https://commandref.fhem.de/#monitoring
und da unter Get
Zitatall
Returns the error and warning list, separated by a blank line.
The formatting can be set with the attributes "errorReturn" and "warningReturn".
default

was sagt denn ein list von dem monitoring device zu diesen attributen!??
viele Wege in FHEM es gibt!

Wolle02

ZitatWenn ich das get zuvor in ein Reading schreibe, um zu testen ob das Reading über den Echo ausgegeben wird, passiert auch nichts.

Ja, das hatte ich auch schon mal probiert; war aber auch nichts.

Zitatall
Returns the error and warning list, separated by a blank line.
The formatting can be set with the attributes "errorReturn" and "warningReturn".
default

Ich habe jetzt testweise mal die Sprachausgabe mit einer Squeezebox anstatt des Echos versucht und da funktioniert die Sprachausgabe tadellos. Es muss also tatsächlich an der Formatierung der Ausgabe des monitoring devices liegen, dass das Echo Modul damit nicht klarkommt. Ich habe die Formatierung über die Attribute "errorReturn" und "warningReturn" auf default gelassen. Jetzt muss ich erstmal dahintersteigen, wie diese Formatierung funktioniert. Sieht auf den ersten Blick kompliziert aus  :)

Wolle02

Jetzt habe ich das Attribut "errorReturn" mal so geändert:

{return unless(@errors);
$_ = AttrVal($_, "alias", $_) foreach(@errors);
return("Das Fenster \"$errors[0]\" ist schon länger geöffnet.") if(int(@errors) == 1);
@errors = sort {lc($a) cmp lc($b)} @errors;
return(join(" ", "Die folgenden ".@errors." Fenster sind schon länger geöffnet:", @errors))
}


Jetzt kommt kein Zeilenumbruch und kein Bindestrich mehr, sondern alles in einer Zeile. Trotzdem bleibt der Echo stumm.

Wenn ich den Rückgabewert aber so wie er kommt direkt im Echo Device in den speak Befehl einsetze, kommt korrekt die Sprachausgabe.
Da ja jetzt TommLee auch nochmal testweise die Rückgabe des Get-Befehls in ein Reading geschreiben hat, müsste damit doch belegt sein, dass die Rückgabe schon ein String ist und kein Hash oder sonst was.
Wir haben jetzt also einen String und eine einzeilige Ausgabe ohne Bindestriche und Umbrüche. Leider gehts mit dem Echo trotzdem nicht. Beim Squeezeboxmodul funktioniert es.

Ich habe Michael Winkler mal auf diesen Thread aufmerksam gemacht. Vielleicht meldet er sich ja auch noch und hat eine zündende Idee.

TomLee

#19
Und wenn man nach deiner Anpassung immer noch irgendwelche vorhandenen newlines entfernt klappt auch der speak-Befehl  :)

defmod test_n notify Testschalter {if (ReadingsVal("Fenster_monitoring","allCount","") > 0) {my $status=fhem("get Fenster_monitoring all");$status =~ s/\n$//g;fhem("set ECHO_Buero speak ".$status)}}

Wolle02

Ja jippiieee, tatsächlich.  :D :D
Super, aber Puhh was für eine Geburt.

Vielen herzlichen Dank an alle beteiligten tollen Helfer.

TomLee

Für die die es interessiert und evt. noch besser wissen:

Weshalb mit meinem Vorschlag von gestern nur das letzte \n enfernt wurde hat mich weiterhin beschäftigt.
War auch nur ein Schnippsel den ich aus dem Forum aufgegriffen hatte, der aber auch bei mehrzeiligen Strings greifen sollte.

Den entscheidenden Hinweis fand ich hier, was mich wiederum nach hier führte.

Aus
ZitatBy default, the "^" character is guaranteed to match only the beginning of the string, the "$" character only the end (or before the newline at the end), and Perl does certain optimizations with the assumption that the string contains only one line. Embedded newlines will not be matched by "^" or "$" . You may, however, wish to treat a string as a multi-line buffer, such that the "^" will match after any newline within the string (except if the newline is the last character in the string), and "$" will match before any newline. At the cost of a little more overhead, you can do this by using the /m modifier on the pattern match operator. (Older programs did this by setting $* , but this option was removed in perl 5.10.)

To simplify multi-line substitutions, the "." character never matches a newline unless you use the /s modifier, which in effect tells Perl to pretend the string is a single line--even if it isn't.

hab ich mir jetzt zusammengereimt das die Angabe von \n in

return(join("\n - ", "Die folgenden ".@errors." Fenster sind schon länger geöffnet:", @errors))

eingebette Zeilenumbrüche sind und so aus einem mehrzeiligen String entfernt werden können.

$status =~ s/\n+//mg;

So klappts zumindest bei mir, ohne Anpassung am Attribut errorReturn.

Gruß

Thomas

edit:

Die Bindestriche noch entfernen (auch wenn sie bei der Sprachausgabe nicht stören) und ohne m klappts auch:

$status =~ s/(-|\n)+//g;

Otto123

Falls man einfach im String nach Zeichen suchen will die nicht "gedruckt" werden:
Ich verwende da immer hexdump. Um es einfach auf den get Befehl anzuwenden, könnte man es so in der FHEM Kommandozeile machen:
{my $string=fhem("get RolloKUL cmdList");;my $out=qx(echo "$string" |hexdump);;return $out}
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

Mach ich was falsch ?

{my $string=fhem("get Fenster_monitoring all");;my $out=qx(echo "$string");;return $out}

Die folgenden 2 Fenster sind schon länger geöffnet:
- du_Testy
- du_Testy2

{my $string=fhem("get Fenster_monitoring all");;my $out=qx(echo "$string" |hexdump);;return $out}

0000000 6944 2065 6f66 676c 6e65 6564 206e 2032
0000010 6546 736e 6574 2072 6973 646e 7320 6863
0000020 6e6f 6c20 a4c3 676e 7265 6720 c365 66b6
0000030 6e66 7465 0a3a 2d20 6420 5f75 6554 7473
0000040 0a79 2d20 6420 5f75 6554 7473 3279 0a0a
0000050

Otto123

Wieso? der Text zählt im Editor 80 Zeichen, der Hexdump hat 5*16
Es beginnt mit Di ... und endet auf y2

Es gibt Zeichen im String >127 (c3a4 c3b6 UTF-8 ä ö) sowie Leerzeichen und linefeed

Alles so wie es soll?

Das war je kein Lösungsvorschlag, sondern nur ein Begleitweg für die Analyse :)
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