Perl-Bedingungen in notify liefern nicht das erwartete Ergebnis

Begonnen von balli1187, 10 Januar 2019, 11:00:41

Vorheriges Thema - Nächstes Thema

balli1187

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
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Wzut

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","");
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

balli1187

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
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Wzut

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.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

rabehd

Ich finde die Konstuktion ein wenig ungewöhlich.
Warum keine elsif und else?
Auch funktionierende Lösungen kann man hinterfragen.

KernSani

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
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

balli1187

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
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Beta-User

...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");
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

KernSani

<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>
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

rabehd

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");
}
Auch funktionierende Lösungen kann man hinterfragen.

Beta-User

[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;")
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

rabehd

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. :-\
Auch funktionierende Lösungen kann man hinterfragen.

Beta-User

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) :) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

balli1187

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
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero