Hallo liebe Community,
ich habe mir paar kleine Routinen angelegt, wo ich verschiedene Standardnachrichten anhand der derzeitigen Uhrzeit ermitteln möchte.
Manchmal klappt es, manchmal nicht.
1. Unterroutine sendMsg wird mit folgenden Parameter aufgerufen:
- Handynummer / TelegramID
- Name
- Anwesend / Abwesend
Dies schaut dann so aus:
Zitat
sendMsg("4917XXXXXXX",$alias,$event);
Da ich z.Z. noch zweigleisig fahre (WhatsApp & Telegram), frage ich in der Routine sendMsg kurz ab, ob es sich um WhatsApp oder Telegram handelt:
Zitat
# -- Sendet eine WhatsApp Nachricht
sub sendMsg($$$)
{
my ($nr,$alias,$event) = @_;
my $nr1 = substr($nr,0,4);
if ($nr1 eq "4917")
{
fhem "set WhatsApp send $nr ".getRandomText($event,$alias);
}
else
{
fhem "set teleBot message \@$nr ".getRandomText($event,$alias);
}
}
Bis hier hin klappt alles. Die Routine getRandomText soll mir Anhand der derzeitigen Minute einen Text ermitteln. Standardmäßig setze ich den Text "Dies ist eine Standard Nachricht", dieser String sollte aber durch die folgende Ermittlung überschrieben werden. Ich würde sagen, 3x von 10x schafft er es nicht und liefert mir als Nachricht "Dies ist eine Standard Nachricht", was mir zeigt, dass die Ermittlung fehlgeschlagen ist.
Zitat
# -- Ermittelt einen Text
sub getRandomText($$)
{
my ($event,$alias) = @_;
return undef if (!$event || !$alias);
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
$min = substr($min,1,1);
my $txt = "Dies ist eine Standard Nachricht!";
if ($event eq "present")
{
$txt = "Herzlichen Willkommen Zuhause $alias" if ($min eq "1");
$txt = "Schön, dass du hier bist $alias" if ($min eq "2");
$txt = "Ach, was seh ich da? $alias ist nach Hause gekommen?! HALLO!" if ($min eq "3");
$txt = "Ein Eindrinling? Nein, $alias war es!" if ($min eq "4");
$txt = "Ist es schon wieder so spät, dass $alias schon wieder Zuhause ist?" if ($min eq "5");
$txt = "Hey $alias!" if ($min eq "6");
$txt = "Hi $alias" if ($min eq "7");
$txt = "$alias, schön das du hier bist!" if ($min eq "8");
$txt = "Anwesenheitserkennung ist scharf gestellt, $alias!" if ($min eq "9");
$txt = "Bonjour, $alias!" if ($min eq "0");
}
else
{
$txt = "Tschüss $alias, bis bald. Ich hoffe, du kommst schnell wieder zurück nach Hause!" if ($min eq "1");
$txt = "Auf Wiedersehen $alias!" if ($min eq "2");
$txt = "WAS? $alias, du willst schon gehen?" if ($min eq "3");
$txt = "ACHTUNG $alias, ich hoffe du hast die Tür auch zweimal abgeschlossen?! Oder war noch jemand Zuhause?" if ($min eq "4");
$txt = "Bis später $alias" if ($min eq "5");
$txt = "$alias, da du jetzt die Wohnung verlassen hast, habe ich den Wachhund scharf gestellt!" if ($min eq "6");
$txt = "Au revoir $alias" if ($min eq "7");
$txt = "$alias, hast du den Müll mit raus genommen?" if ($min eq "8");
$txt = "$alias, bis bald!!" if ($min eq "9");
$txt = "Schön, dass du hier warst $alias!" if ($min eq "0");
}
return $txt;
}
Ich kann es mir nicht erklären, warum es manchmal klappt und warum manchmal nicht, aber vielleicht habt ihr einen Tipp für mich :)
Gruß
Mathias
Bitte angepinnten Beitrag beachten
ZitatBoard ist nur für funktionsfähige Codeschnipsel! Keine Fragethemen starten!
;)
Probier mal statt:
$min = substr($min,1,1);
das aus:
$min =~ s/^\d//;
Obwohl das Ergebnis eigentlich das gleiche sein sollte.
Eigentlich kann doch dein Standardtext nur kommen wenn $min nicht vorliegt.
Deine Vergleiche sind falsch! 8)
Zahlen solltest Du auch als Zahlen vergleichen.
Statt:
if ($min eq "1");
lieber:
if ($min == 1);
Gruß
Dan
# -- Sendet eine WhatsApp Nachricht
sub sendMsg($$$)
{
my ($nr,$alias,$event) = @_;
my $nr1 = substr($nr,0,4);
if ($nr1 eq "4917")
{
fhem "set WhatsApp send $nr ".getRandomText($event,$alias);
}
else
{
fhem "set teleBot message \@$nr ".getRandomText($event,$alias);
}
}
Das lässt sich auch um eine Variable leichter machen.
Regex ist Dein Freund! 8)
sub sendMsg($$$)
{
my ($nr,$alias,$event) = @_;
if ($nr =~ /^491/)
{
fhem "set WhatsApp send $nr ".getRandomText($event,$alias);
}
else
{
fhem "set teleBot message \@$nr ".getRandomText($event,$alias);
}
}
Gruß
Dan
Zitat von: DeeSPe am 13 Dezember 2016, 14:30:16
Probier mal statt:
$min = substr($min,1,1);
das aus:
$min =~ s/^\d//;
Obwohl das Ergebnis eigentlich das gleiche sein sollte.
Das Ergebnis ist wohl nicht das gleiche, da z.B: um 14:01 die Variable $min nur "1" enthält und damit der substr ins Leere läuft.
Also wie von DeeSPe - Zahlen sind Zahlen und sollten als solche behandelt werden
Zitat von: viegener am 13 Dezember 2016, 14:35:53
Das Ergebnis ist wohl nicht das gleiche, da z.B: um 14:01 die Variable $min nur "1" enthält und damit der substr ins Leere läuft.
Also wie von DeeSPe - Zahlen sind Zahlen und sollten als solche behandelt werden
Ahhh, das war mir auch nicht bewusst dass $min nur 1 liefert bei 14:01! Ich dachte 01.
Dann funktioniert meine vorgeschlagene Substitution auch so nicht.
Dann aber so vielleicht:
$min =~ s/^\d// if (length $min == 2);
Gruß
Dan
Hi, danke für eure Hilfe.
Den Vergleich der Minuten machen ich nun mit == :)
Was liefert mir
Zitat
$min = substr($min,1,1);
wenn wir 14:00, 14:01, 14:02, 14:03, 14:04, 14:05, 14:06, 14:07, 14:08 & 14:09Uhr haben?
Gruß
Mathias
Zitat von: t1me2die am 13 Dezember 2016, 15:05:27
Hi, danke für eure Hilfe.
Den Vergleich der Minuten machen ich nun mit == :)
Was liefert mir
wenn wir 14:00, 14:01, 14:02, 14:03, 14:04, 14:05, 14:06, 14:07, 14:08 & 14:09Uhr haben?
Gruß
Mathias
Probiere es einfach aus!!! ;)
Was gefällt Dir an meinem Vorschlag nicht?
Zitat von: DeeSPe am 13 Dezember 2016, 14:53:27
$min =~ s/^\d// if (length $min == 2);
Das sollte immer die erste Stelle wegkürzen sofern die Zahl 2 Stellen hat.
Gruß
Dan
Mir gefällt alles an deinem Vorschlag, ich musste es nur erstmal verstehen ;D
Sobald Du es verstanden und getestet hast, kannst Du ja nochmal Bescheid geben ob es geklappt hat! 8)
Gruß
Dan
Moin Dan,
kurze Rückmeldung. Verstanden und funktioniert :)
Danke
Danke für die Rückmeldung.
Gruß
Dan