[GELÖST] Eigene Routine liefert manchmal kein Ergebnis

Begonnen von t1me2die, 13 Dezember 2016, 14:15:15

Vorheriges Thema - Nächstes Thema

t1me2die

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

kumue

Bitte angepinnten Beitrag beachten
ZitatBoard ist nur für funktionsfähige Codeschnipsel! Keine Fragethemen starten!
;)

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

# -- 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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

t1me2die

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

t1me2die

Mir gefällt alles an deinem Vorschlag, ich musste es nur erstmal verstehen  ;D

DeeSPe

Sobald Du es verstanden und getestet hast, kannst Du ja nochmal Bescheid geben ob es geklappt hat! 8)

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

t1me2die

Moin Dan,

kurze Rückmeldung. Verstanden und funktioniert  :)

Danke

DeeSPe

MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe