FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: balli1187 am 10 Januar 2019, 11:00:41

Titel: Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: balli1187 am 10 Januar 2019, 11:00:41
Hallo,

Ich bräuchte mal etwas Hilfe bei nachfolgendem notify. Das notify an sich "funktioniert" als wird getriggert udn liefert auch was zurück aber das Ergebnis passt nicht ganz.

Marker_FlashBriefing:on {
my $string = "";
if (ReadingsVal("CalMarker_Event","alertMessage","") ne 'Es stehen heute keine Termine an.') {
$string = ReadingsVal("CalMarker_Event","alertMessage","")." ";
}
if (ReadingsVal("CalMarker_Birthday","alertMessage","") ne 'Es stehen keine Geburtstage an.') {
$string .= ReadingsVal("CalMarker_Event","alertMessage","");
}
if ($string eq "") {
$string = "Du hast heute keine Termine.";
}
fhem("set Ku_EchoDot speak $string; set Marker_FlashBriefing off");
}


Zur Erklärung: in den Readings(alertMessage) der einzelnen CalMarker(dummies) stehen Kalenderzusammenfassungen, die ich aus meinen verschiedenen Calview-Devices hole und per Echo Dot ausgeben möchte. Einzeln funktioniert das wunderbar.
Für die tägliche Zusammenfassung möchte ich aber alles kombinieren und die einzelnen Nachrichten aneinander hängen, sofern es einen Kalendereintrag gibt.
In dem oben stehenden notify gibt es leider Probleme mit den Bedingungen:
- Wenn das 'ne' in der Bedingung eine 0 zurückgeben sollte und das Kommando nicht ausgeführt werden sollte, wird es dennoch ausgeführt und die weiteren Bedingungen werden ignoriert. Teste ich die Bedingung in der Kommandozeile liefert das "ne" nichts zurück. Ersetze ich es durch ein "eq" bekommen ich die erwarte 1.

Beispiel:
- Gestern hatte ich keinen Eintrag in meinem Terminkalender aber einen dafür einen im Geburtstagskalender.
- erwartete Ausgabe wäre daher nur die Erinnerung an den Geburtstag gewesen, da der erste Teil eigentlich hätte übersprungen werden sollen.
- erhaltene Ausgabe war hingegen: "Es stehen heute keine Termine an." also der Defaultwert im Reading des ersten Markers. Der zweite Teil entfiel.

Hat jemand einen Tipp woran das liegt?
Ich habe jetzt absichtlich aus Gründen der Übersichtlichkeit noch keine lists oder so angehangen, da es mehrere Dummies und notifys für das Gesamtkonstrukt wären und der Beitrag eh schon recht lang geworden ist...

Vielen Dank und VG,
Stephan
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: Wzut am 10 Januar 2019, 11:23:43
Zitat von: balli1187 am 10 Januar 2019, 11:00:41
if (ReadingsVal("CalMarker_Birthday","alertMessage","") ne 'Es stehen keine Geburtstage an.') {
$string .= ReadingsVal("CalMarker_Event","alertMessage","");

copy & paste Fehler ? , sollte es vllt sein :

if (ReadingsVal("CalMarker_Birthday","alertMessage","") ne 'Es stehen keine Geburtstage an.') {
$string .= ReadingsVal("CalMarker_Birthday","alertMessage","");
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: balli1187 am 10 Januar 2019, 12:39:57
Grrrrr.... das glaub ich dich jetzt nicht. Keine Ahnung wie oft ich das schon durchgegangen bin unscharf ist mir nicht aufgefallen....

Danke dafür!


Gesendet von iPhone mit Tapatalk
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: Wzut am 10 Januar 2019, 13:12:40
passiert mir auch öfters, man liest 20 mal das was es sein sollte aber nicht was da steht, erst ein Unbeteiligter liest dann das was wirklich geschrieben wurde.
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: rabehd am 10 Januar 2019, 14:56:14
Ich finde die Konstuktion ein wenig ungewöhlich.
Warum keine elsif und else?
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: KernSani am 10 Januar 2019, 15:01:39
Zitat von: rabehd am 10 Januar 2019, 14:56:14
Warum keine elsif und else?
Ich denke, weil es kein ELSE ist, sondern zumindest die ersten beiden auch gemeinsam auftreten können
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: balli1187 am 10 Januar 2019, 15:02:27
Zitat von: rabehd am 10 Januar 2019, 14:56:14
Ich finde die Konstuktion ein wenig ungewöhlich.
Warum keine elsif und else?
es kann ja durchaus sein, dass ich an einem Tag einen Eintrag im Terminkalender habe und gleichzeitig jemand Geburtstag hat. In dem Fall möchte ich auch über beide Ereignisse informiert werden.
Ein elsif/else verbinde ich immer mit einem "Oder" und dann würde die zweite Info verlieren.
Jetzt muss ich aber dazu sagen, dass ich auch noch recht unerfahren mit Perl bin ;-)


Gesendet von iPhone mit Tapatalk
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: Beta-User am 10 Januar 2019, 15:10:42
...die Fragen sind eher:
- warum keine hinten angestellten Abfragen und
- (teilweise) warum "if" und Negierung statt "unless"?

So finde ich es für solche einfacheren Fälle übersichtlicher zu lesen:

Marker_FlashBriefing:on {
  my $string = "";
  $string = ReadingsVal("CalMarker_Event","alertMessage","")." " unless (ReadingsVal("CalMarker_Event","alertMessage","") eq 'Es stehen heute keine Termine an.');
  $string .= ReadingsVal("CalMarker_Birthday","alertMessage","") unless (ReadingsVal("CalMarker_Birthday","alertMessage","") eq 'Es stehen keine Geburtstage an.');
  $string = "Du hast heute keine Termine." if ($string eq "");
  fhem("set Ku_EchoDot speak $string; set Marker_FlashBriefing off");
}
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: KernSani am 10 Januar 2019, 15:23:47
<OFFTOPIC>
Das könnte eine nette Diskussion geben ;-) Es mag an meiner nicht-Perl-Vergangenheit liegen, aber ich persönlich mag die hinten angestellten if/unless nicht so gerne, da irgendwann dann doch weitere Bedingungen oder einfach weitere Befehle dazu kommen und dann bin ich doch wieder am nach vorne ziehen, oder wie handhabst du das?
</OFFTOPIC>
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: rabehd am 10 Januar 2019, 15:31:25
ZitatEs mag an meiner nicht-Perl-Vergangenheit liegen, aber ich persönlich mag die hinten angestellten if/unless nicht so gerne,
Geht mir genauso.

Idee des Erstellers verstanden. Wie wäre das?
Marker_FlashBriefing:on {
  my $string = "Du hast heute keine Termine.";
  $string = ReadingsVal("CalMarker_Event","alertMessage","")." " unless (ReadingsVal("CalMarker_Event","alertMessage","") eq 'Es stehen heute keine Termine an.');
  $string .= ReadingsVal("CalMarker_Birthday","alertMessage","") unless (ReadingsVal("CalMarker_Birthday","alertMessage","") eq 'Es stehen keine Geburtstage an.');
    fhem("set Ku_EchoDot speak $string; set Marker_FlashBriefing off");
}
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: Beta-User am 10 Januar 2019, 15:39:34
[OT]
Habe auch keine riesige Perl-Vergangenheit und finde das mit dem hinten angestellten Abfragen auch eher "speziell". Das kommt v.a. dann zum Einsatz, wenn ich mir recht sicher bin, "dass es das auch wirklich war", aber dann mag ich es! Finde es (wie das unless statt if mit !) "natürlich" zu lesen und man kann sich die Klammern und Einrückungen sparen (die mache ich per default bzw. versuche es, da macht mein Editor iVm. github manchmal komische Sachen...).

Womit ich mich aber noch schwer tue, sind die noch weiter verkürzten Formen (das "...?x:y"), am besten noch verschachtelt ??? .
Aber das geht ja auch in C :) .
[/OT]

@rabehd: Was passiert, wenn die erste Abfrage nicht zurtrifft, aber die zweite?

Weglassen könnte man aber m.E. die Erstzuweisung der Variable (verkürzen zu "my $string;")
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: rabehd am 10 Januar 2019, 15:47:07
Zitat@rabehd: Was passiert, wenn die erste Abfrage nicht zurtrifft, aber die zweite?
Dann gibt es so ein Problem.  :(
Das kommt vom verbessern ohne sich Gedanken über die Gesamtheit zu machen. :-\
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: Beta-User am 10 Januar 2019, 16:04:14
Zitat von: rabehd am 10 Januar 2019, 15:47:07
Dann gibt es so ein Problem.  :(
Das kommt vom verbessern ohne sich Gedanken über die Gesamtheit zu machen. :-\
;D
...ich wäre fast in dieselbe Falle getappt in dem Bemühen, die Dinge zu verkürzen; nur deswegen habe ich es gleich gesehen, wo der Haken dabei ist ;) .

Aber ist doch gut, da hat man eine nette Diskussion und alle lernen was dabei (auch wenn es ansonsten nur Geschmacksfragen sind) :) .
Titel: Antw:Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis
Beitrag von: balli1187 am 10 Januar 2019, 20:26:50
Sorry für die Pause - war im Auto unterwegs.

Vielen Dank euch allen für die interessante Diskussion. Mir war nicht klar, dass man die Bedingung auch hinten anstellen kann und diesen "unless" Operator kannte ich auch noch nicht.

Mein notofy muss ich gleich mal anpassen und dann mal testen, was der Dot so von sich gibt.


Gesendet von iPhone mit Tapatalk