[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

Wolle02

Hallo zusammen,

so richtig warm werde ich mit Perl einfach nicht, deshalb poste ich die Frage mal ins Anfängerforum.  ::)

Ich habe mir ein notify gebastelt, das prüfen soll, ob bei mir Fenster geöffnet sind. Wenn ja soll das Ergebnis des Moduls "monitoring" in eine Variable geschrieben werden und diese per Speak-Befehl auf einem Echo ausgegeben werden.

Das notify sieht so aus:

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

Leider passiert einfach überhaupt nichts.
Wenn ich noch ein Log 2, $status dazwischen schreiben, wird das Ergebnis von $status auch korrekt ins Logfile geschrieben und wenn ich mit dem Inhalt von $status den Befehl "set ECHO_Buero speak Das Fenster "Wohnzimmer_West" ist seit kurzem geöffnet." direkt in die Befehlszeile schreibe, dann wird der Text auch korrekt vom Echo ausgegeben.

Kann mir bitte jemand auf die Sprünge helfen warum das nicht tut?

Danke und Gruß
Wolle

Otto123

#1
Hallo Wolle,

beim define (auch bei defmod) musst Du die ; verdoppeln! -> https://fhem.de/commandref_DE.html#command
defmod test_n notify Testschalter {if (ReadingsNum("Fenster_monitoring","allCount",-1) > 0) {my $status=fhem("get Fenster_monitoring all");;fhem("set ECHO_Buero speak ".$status)}}
Es triggert aber auf jeden Event von Testschalter, das musst Du eventuell etwas schärfer machen! Schau dir die Sache im Eventmonitor an und dort kannst Du auch für den passenden Event ein notfy erstellen lassen.

Gruß Otto
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

Wolle02

Hallo Otto,

danke für deine Unterstützung. Das hatte ich aber auch schon ausprobiert. Der Effekt ist leider der selber; nämlich gar keiner.

Dass der Testschalter auf jedes Event triggert ist klar; dient gerade nur dazu um das auszuprobieren ;-)

Gruß
Wolle

Otto123

und den Befehl so?
fhem("set ECHO_Buero speak $status")
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

Wolle02

Zitat von: Otto123 am 05 April 2020, 22:42:19
und den Befehl so?
fhem("set ECHO_Buero speak $status")

Komisch, da hätte ich jetzt erwartet, dass er $status als gesprochenes Wort ausgibt. Aber auch in dieser Version passiert nichts. Der Inhalt der Variablen wird aber nach wie vor korrekt ins Logfile geschrieben:

2020.04.06 05:54:51 3: get Fenster_monitoring all : Die folgenden 3 Fenster sind schon länger geöffnet:
- Kinderzimmer_Nord
- Küche
- Schlafzimmer_Ost



Otto123

Moin,

innerhalb von "$variable" wird die Variable aufgelöst, innerhalb von '$variable' nicht.
Es gibt doch nur drei Möglichkeiten warum "nichts" passiert:
notify triggert nicht - hast Du ausgeschlossen durch den Test mit Log Eintrag.
Dein Ausführungsteil funktioniert nicht:
- Die if Bedingung wird nicht wahr - hast Du ausgeschlossen durch Log Eintrag, oder hast Du den ohne if gemacht?
- Der Teil  nach der Bedingung funktioniert nicht.

Teste doch "von hinten" mal alles einzeln in der Kommandozeile.
set ECHO_Buero speak Test
{fhem("set ECHO_Buero speak Test")}
{my $status="Test";;fhem("set ECHO_Buero speak $status")}
{my $status=fhem("get Fenster_monitoring all");;fhem("set ECHO_Buero speak $status")}
{if (1) {fhem("set ECHO_Buero speak Test")}}
{if (ReadingsNum("Fenster_monitoring","allCount",-1) > 0) {fhem("set ECHO_Buero speak Test")}}
{if (ReadingsNum("Fenster_monitoring","allCount",-1) > 0) {my $status=fhem("get Fenster_monitoring all");;fhem("set ECHO_Buero speak $status")}

Gruß Otto
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

Bezugnehmend auf den vermuteten Verdacht von Otto und dem gelöschten Beitrag von Joachim:

Gäbe es denn die Möglichkeit die Meldung

Help:

No argument given.

More informations: https://mwinkler.jimdo.com/smarthome/eigene-module/echodevice/#Set


ausgeben zu lassen, wenn $status wirklich leer wäre ?

Gruß

Thomas

Wolle02

#7
Hallo Otto,

zunächst mal vielen Dank, dass du mit so einer großen Vehemenz zu helfen versuchst. Das find ich wirklich toll.  :D

Du hast ja netterweise die Codezeilen schon vorgegeben. Ich habe sie alle der Reihe nach durchgetestet. Das Ergebnis ist so wie ich es erwartet habe (aber nicht verstehe):

set ECHO_Buero speak Test
funktioniert

{fhem("set ECHO_Buero speak Test")}
funktioniert

{my $status="Test";;fhem("set ECHO_Buero speak $status")}
funktioniert

{my $status=fhem("get Fenster_monitoring all");;fhem("set ECHO_Buero speak $status")}
funktioniert nicht

{if (1) {fhem("set ECHO_Buero speak Test")}}
funktioniert

{if (ReadingsNum("Fenster_monitoring","allCount",-1) > 0) {fhem("set ECHO_Buero speak Test")}}
funktioniert

{if (ReadingsNum("Fenster_monitoring","allCount",-1) > 0) {my $status=fhem("get Fenster_monitoring all");;fhem("set ECHO_Buero speak $status")}
funktioniert nicht

Es funktioniert also nur dann nicht, wenn der Echo den Inhalt einer Variablen ausgeben soll, die zuvor mittels Get aus dem Monitoring Modul geholt wurde. Ich verstehe nur nicht warum das Ergebnis dieses Get korrekt in das Logfile geschrieben wird, aber die Ausgabe via Echo scheitert, obwohl eine direkt vorgegebene Variable wie z.B. my $status="Test" korrekt funktioniert.

@TomLee:
Ich verstehe leider deine Frage nicht wirklich wie eine solche Ausgabe mit

Help:

No argument given.

More informations: https://mwinkler.jimdo.com/smarthome/eigene-module/echodevice/#Set


funktioniert.

MadMax-FHEM

Hmmm, dann hätte ich meinen Beitrag doch nicht löschen sollen/brauchen ;)

Dachte ich wäre auf dem "falschen Dampfer"...

Der get liefert nichts zurück, sondern aktualisiert (verm.) nur Readings...

D.h. du musst sehen wo (welche Readings) der/die gewünschte Wert/Werte stehen und dann per ReadingsVal("DeviceName","ReadingName","na") abfragen und ausgeben...

Ich habe zu dem Zweck (allerdings ohne nennung des Fensters sondern nur "generell" alle zu/auf) einfach einen "Sammeldummy" der den "Gesamtfensterstatus" sammelt und den kann ich abfragen:

Alexa, sind alle Fenster geschlossen?

Und es kommt dann: alle Fenster ist geschlossen ;) oder: alle Fenster ist geöffnet ;)

Hier mal mein "raw definition":


defmod dmAlleFenster dummy
attr dmAlleFenster alexaName alle Fenster
attr dmAlleFenster alias Übersicht aller Fenster
attr dmAlleFenster genericDeviceType contact
attr dmAlleFenster group Fenster und Türen
attr dmAlleFenster homebridgeMapping clear ContactSensorState:contact,values=closed:CONTACT_DETECTED;;open:CONTACT_NOT_DETECTED
attr dmAlleFenster icon fts_window_2w_open_l
attr dmAlleFenster readingList contact
attr dmAlleFenster room Eingang,alexa
attr dmAlleFenster setList open closed
attr dmAlleFenster userReadings contact {ReadingsVal($NAME,"state","n.a.")}


Das userReadings ist nicht nötig (hatte nur noch keine Zeit/Lust das auf "state" umzustellen)...
...dann muss das homebridgeMapping entsprechend auf "state" geändert werden...

Hatte es auch mal mit Structure versucht, da bin ich aber nicht so zurecht gekommen... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Wolle02

Hallo Joachim,

auch dir danke für deinen Tip. Als Workaround würde ich das, wenn es nicht anders geht, dann auch so ähnlich machen.

Aber ich kann deinem Hinweis

ZitatDer get liefert nichts zurück, sondern aktualisiert (verm.) nur Readings...

nicht so ganz folgen, denn wie ich ganz zu Anfangs schrieb

ZitatWenn ich noch ein Log 2, $status dazwischen schreiben, wird das Ergebnis von $status auch korrekt ins Logfile geschrieben

Das ist ja genau das was mich irritiert. In der Variablen ist scheinbar schon was "drin", aber es wird nicht ausgegeben, wobei die Ausgabe komischerweise korrekt funktioniert, wenn ich mit

{my $status="Test";;fhem("set ECHO_Buero speak $status")}

die Variable "direkt" befülle.

????????

Otto123

#10
Vermutung: get liefert keinen String zurück sondern irgendwas anderes - Log wandelt das in einen String dein ECHO nicht.
Das ist ein hash auf ein Array oder ein Array oder so?
Zitat- Kinderzimmer_Nord
- Küche
- Schlafzimmer_Ost

Versuch das mal so - aber ich fische da ziemlich im Trüben :)
my $status=join(" ",fhem("get Fenster_monitoring all"))


Gruß Otto
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

Wolle02

Tja, der letzte Versuch hat leider auch kein Ergebnis gebracht. Aber nun gut, wieder was gelernt....und sei es nur, dass es so halt nicht funktioniert. Wie Joachim ja aufgezeigt hat gibt es ja noch andere Herangehensweisen.

Ich danke euch auf jedenfall sehr.... ihr habt mir trotzdem sehr geholfen.

Viele Grüße.......und bleibt gesund
Wolle

Otto123

Wolle, ich will Dich mal ermutigen noch ein bisschen zu suchen, vielleicht findest Du ja was. Wenn Log das in einen String wandeln kann ...

Vielleicht muss man ja noch etwas manipulieren, Sonderzeichen entfernen, Zeilenumbrüche oder irgend so etwas.

Ich meine Du sagst es passiert nichts, aber die Wahrheit ist doch erstmal: Echo sagt nichts - oder?
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

Wolle02

Zitat von: Otto123 am 07 April 2020, 22:55:31
Ich meine Du sagst es passiert nichts, aber die Wahrheit ist doch erstmal: Echo sagt nichts - oder?

Richtig, aber ich weiß nicht wie ich sonst da weiterforschen soll. Ich halte das schon im Hinterkopf, aber zunächst mal muss ich wegen des WAF zu einer Lösung kommen. Wenn die Pflicht erledigt ist, kommt die Kür.  ;)

frank

probiere mal mit einem zusätzlichen sleep, also so:

{my $status=fhem("get Fenster_monitoring all");;fhem("sleep 1; set ECHO_Buero speak $status")}
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

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