msgDialog: Instant Messaging als FHEM Interface

Begonnen von igami, 30 September 2017, 15:09:01

Vorheriges Thema - Nächstes Thema

ErzGabriel

Okay, hört sich jetzt interessant an, nur verstehe ich das leider null. Meine Dialoge basieren nur auf Copy & Paste, da ich irgendwie zu blöde bin eine Dialoge zu schreiben. Mag dran liegen, das ich mit Perl nicht klar komme oder ich einfach zu blöde bin es zu lernen, weil ich vielleicht versuche das falsche zu lernen.
Aber ich werde mal schauen, was ich erreichen kann, wenn ich Google bemühe.

brown78

Die Dialoge selbst sind in JSON, das kann man schon so halbwegs durchschauen, wenn man sich die Beispiele anschaut. Zumindest hast Du das msg_Config angelegt und das userattr msg_evalSpecials solltest Du auch haben, wenn Du nach dem Wiki vorgegangen bist. In dieses Attribut kannst Du ein eigenes "Feld" eintragen. Nach Anleitung hast Du dort drin stehen:
me=aktivierungswort TelegramBot=BotDevice

Dieser Zeile einfach hinzufügen color=[device:Reading]
-Da merke ich gerade ich hatte vorher geschrieben Du brauchst das Attribut color, das stimmt nicht, das muß ein Reading sein. Also:
setreading Farbpunkt_Device color blau

msg_Config "erhält" dadurch bei Ausführung den Inhalt des Readings color von Deinem Farbpunkt_Device.

Soweit die Theorie, ich weiß natürlich nicht wie Deine Devices aussehen und was die machen, z.B. wechselt die Farbe und wer sagt wann gewechselt werden soll...
Weiter in der Theorie, derjenige der dem Farbpunkt_Device sagt: mach jetzt blau, der muß auch das setreading machen.

In den Dialogen hast du ja irgendwo dann "message": [

stehen, das ist die Nachricht die in Telegram angezeigt wird. Ohne zu wissen wie das bei Dir aussieht, kannst Du den message "Block" sagen, dass er das Reading color von Deinem Farbpunkt_Device anzeigen soll.

"message": [
"Die Farbe [Farbpunkt_Device:color] wurde ausgewählt"
]


Ich hoffe, dass Dir das etwas weiterhilft.

ErzGabriel

Hallo.
Ich kriege es einfach nicht hin, das Telegram mir ein Wort anzeigt.

Also mal ganz von Anfang an. Ich will für meine Maus eine Meldung auf Telegram senden, da Sie Allergien hat und damit dann weiß, ob Sie abends eine Tablette nehmen muss.

Mein Sub in der Utils.
sub telegramBotGetPollenListMessage()
{
my $pol1 = ReadingsVal("Pollen", "fc1_Birke", "0");
my $pol2 = ReadingsVal("Pollen", "fc1_Erle", "0");
my $pol3 = ReadingsVal("Pollen", "fc1_Hasel", "0");
my $pol4 = ReadingsVal("Pollen", "fc1_Graeser", "0");
my $pol5 = ReadingsVal("Pollen", "fc1_Roggen", "0");
my $returnMessage;
$returnMessage .= "Birke: $pol1 \n" if($pol1 !~ /white/);
$returnMessage .= "Erle: $pol1 \n" if($pol2 !~ /white/);
$returnMessage .= "Hasel: $pol1 \n" if($pol3 !~ /white/);
$returnMessage .= "Gräser: $pol1 \n" if($pol4 !~ /white/);
$returnMessage .= "Roggen: $pol1 \n" if($pol5 !~ /white/);
return $returnMessage;
}


Mein Dialog
efmod doif_pollen1 DOIF ([18:10]) (set Jarvis msg @M**** Birke: [Pollen:fc2_Birke]\n\
Gräser: [Pollen:fc2_Graeser]\n\
Roggen: [Pollen:fc2_Roggen])
attr doif_pollen1 do always
attr doif_pollen1 room Telegram

setstate doif_pollen1 cmd_1
setstate doif_pollen1 2020-04-27 18:10:00 cmd 1
setstate doif_pollen1 2020-04-27 18:10:00 cmd_event timer_1
setstate doif_pollen1 2020-04-27 18:10:00 cmd_nr 1
setstate doif_pollen1 2020-04-24 18:07:07 mode enabled
setstate doif_pollen1 2020-04-27 18:10:00 state cmd_1
setstate doif_pollen1 2020-04-27 19:33:29 timer_01_c01 28.04.2020 18:10:00


Funzt so weit. Die Meldung kommt jeden Abend auf dem Handy an, nur das Ergebniss sieht mies aus.

Ergebnis:
Birke: rc_dot@white
Gräser: rc_dot@yellow
Roggen: rc_dot@white

Die beiden unteren Angaben sind in Telegram auch so eingerückt, damit könnte ich ja noch leben aber die Anzeige vom Ergebnis hätte ich gerne anders.
rc_dot@white = keine
rc_dot@yellow = leichte
rc_dot@orange = mittel
rc_dot@red = stark

Ich habe es nach der Anleitung von brown78 versucht aber ich kriege es nicht hin.
Kann mir bitte jemand helfen?
Danke.

binford6000

#723
Zitat von: ErzGabriel am 27 April 2020, 19:52:47
Ich habe es nach der Anleitung von brown78 versucht aber ich kriege es nicht hin.
Kann mir bitte jemand helfen?
Danke.

Ich habe die Pollen momentan so am Start:

Dialog:
{"11.🌿🌼.Pollen.🌸🌺": {
  "commands": "{pollen()}",
  "message": [
  "(%me%) ",
  "Hole Pollen..."
  ]
}
}


PERL-Funktion:
sub pollen() {
my $msg;
my @plants = ("Ahorn", "Ambrosia", "Ampfer", "Beifuss", "Birke", "Brennnessel", "Buche", "Eiche", "Erle", "Esche", "Fichte", "Flieder", "Gaensefuss", "Gerste", "Graeser", "Hafer", "Hasel", "Holunder", "Hopfen", "Kiefer", "Linde", "Loewenzahn", "Mais", "Nessel", "Pappel", "Platane", "Raps", "Roggen", "Rotbuche", "Spitzwegerich", "Tanne", "Ulme", "Wegerich", "Weide", "Weizen");
foreach my $plant (@plants) {
my $pol = ReadingsVal("Allergene","fc2_$plant", "");
if ($pol !~ /white|yellow/) {
$msg .= "🌳"  if ($plant =~ /Ahorn|Birke|Buche|Eiche|Erle|Esche|Linde|Rotbuche|Pappel|Platane|Ulme|Weide/);
$msg .= "🌲"  if ($plant =~ /Fichte|Kiefer|Tanne/);
$msg .= "🌿"  if ($plant =~ /Ambrosia|Ampfer|Beifuss|Brennessel|Gaensefuss|Graeser|Holunder|Nessel|Spitzwegerich|Wegerich/);
$msg .= "🌾"  if ($plant =~ /Gerste|Hafer|Hopfen|Raps|Roggen|Weizen/);
$msg .= "🌼"  if ($plant =~ /Flieder|Loewenzahn/);
$msg .= "🌽"  if ($plant =~ /Mais/);
$msg .= "🌰"  if ($plant =~ /Hasel/);
$msg .= "$plant: mittel. 🟡\n" if ($pol =~ /yellow/);
$msg .= "$plant: hoch! 🟠\n" if ($pol =~ /orange/);
$msg .= "$plant: extrem hoch! 🔴\n" if ($pol =~ /red/);
}
}
fhem("msg push $msg") if ($msg);
}


Ist nicht schön aber funktioniert   ;D
VG Sebastian

ErzGabriel

Hi Sebastian.
Das sieht ja nicht schlecht aus aber dafür muss meine Maus selbst abfragen und sowas vergisst Sie gerne mal. Ende vom Lied ist dann, das ich mir am nächsten Tag das Gejammer anhören kann, weil Sie ihre Tablette nicht genommen hat.

Mir ist aber mit Deinem Post jetzt schon mal ein Fehler bei meinem Gebastel aufgefallen. Meine Sub ist sinnlos, da ich die Readings für die Message abfrage.
Also muss ich jetzt erstmal raus kriegen, wie ich das Ergebnis meiner Sub per Telegram versenden kann und dann kann ich vielleicht den unteren Part von Dir in meine Sub einbauen um ordentliche Punkte zu haben.

binford6000

Zitat von: ErzGabriel am 28 April 2020, 18:35:41
Hi Sebastian.
Das sieht ja nicht schlecht aus aber dafür muss meine Maus selbst abfragen und sowas vergisst Sie gerne mal. Ende vom Lied ist dann, das ich mir am nächsten Tag das Gejammer anhören kann, weil Sie ihre Tablette nicht genommen hat.

Mir ist aber mit Deinem Post jetzt schon mal ein Fehler bei meinem Gebastel aufgefallen. Meine Sub ist sinnlos, da ich die Readings für die Message abfrage.
Also muss ich jetzt erstmal raus kriegen, wie ich das Ergebnis meiner Sub per Telegram versenden kann und dann kann ich vielleicht den unteren Part von Dir in meine Sub einbauen um ordentliche Punkte zu haben.

Ob du eine Sub in einem Dialog aufrufst oder in einem at/doif ist ja wurscht  ;)
VG Sebastian

ErzGabriel

Okay, das ist einleuchtend. Ich muss trotzdem erstmal raus kriegen, wie ich die Subroutine in die Message kriege, das der Bot sie versendet.

binford6000

Zitat von: ErzGabriel am 28 April 2020, 20:11:16
Okay, das ist einleuchtend. Ich muss trotzdem erstmal raus kriegen, wie ich die Subroutine in die Message kriege, das der Bot sie versendet.

Das verstehe ich nicht. Dein doif könnte so aussehen:
defmod test.di DOIF ([18:10]) ({pollen()})

Das Versenden der $msg muss nicht mit dem msg-Befehl erfolgen, kann auch direkt mit dem bot gemacht werden:
fhem("set Jarvis msg $msg") if ($msg);
VG Sebastian

ErzGabriel

@Sebastian
Ich habe die Subroutine jetzt so eingepflegt wie von Dir gepostet und das DOIF auch soweit umgebaut. Habe noch die gesendeten Daten ein wenig angepasst aber irgendwas habe ich wohl übersehen, weil beim Bot kommt immer nur ein
Zitatpush
raus. Muss ich irgendwo noch was eintragen, das der Bot das umsetzen kann, weil ne Fehlermeldung erhalte ich nicht.

binford6000

Das hatte ich auch schon. Dann gibts laut Prüfung keine Warnungen und somit kein $msg. Also wird anstatt $msg ,,push" als Text gesendet...
Schaum mal oben in den Code - ich hab noch ein if ($msg)
eingefügt [emoji6]
Noch schöner: ein else-Block mit eine Nachricht dass die Belastung gering ist oder so...
VG Sebastian


Gesendet von iPhone mit Tapatalk

ErzGabriel

Jo, funzt. Danke Dir.
Eine Frage hätte ich jetzt noch und die nur aus Faulheit, weil ich das jetzt nicht ewig testen und probieren möchte.
fhem("msg push $msg") if ($msg);
Diese Zeile ist für das senden zuständig und die Nachricht kommt jetzt immer bei mir an, wie muss ich die ändern, das es an meine Maus gesendet wird.
Ist das so richtig?
fhem("msg @NAME push $msg") if ($msg);

binford6000

Zitat von: ErzGabriel am 02 Mai 2020, 08:41:45
Jo, funzt. Danke Dir.
Eine Frage hätte ich jetzt noch und die nur aus Faulheit, weil ich das jetzt nicht ewig testen und probieren möchte.
fhem("msg push $msg") if ($msg);
Diese Zeile ist für das senden zuständig und die Nachricht kommt jetzt immer bei mir an, wie muss ich die ändern, das es an meine Maus gesendet wird.
Ist das so richtig?
fhem("msg @NAME push $msg") if ($msg);

help msg
zeigt
msg [<type>] [<@device>|<e-mail address>] [<priority>] [|<title>|] <message>

Also so zB.:
msg push @rr_Sebastian $msg

Im verlinkten Forums-Thread findet du weiterhin:
Auch können mehrere Typen oder Empfänger durch Komma getrennt angegeben werden (Und-Verknüpfung).

VG Sebastian

binford6000

Im Dialog habe ich es jetzt so umgebaut, dass der Dialog aufrufende User die Nachricht bekommt:
{"08.🌿🌼.Pollen.🌸🌺": {
  "message": [
  "(%me%) ",
  "Aktuelle Pollenbealstung:",
  "{return pollen() }"
  ]
}
}


In der sub dann:
return $msg;

VG Sebastian

ErzGabriel

Es klappt noch nicht die Daten an meine Maus zu schicken.
Habe die Zeile entsprechend umgebaut aber es kommen die Daten immer noch bei mir an, sollen aber zu meiner Maus.
DoIF's, wo der Code im Define steht kann ich an meine Maus schicken lassen aber hier wo der Code in der Subroutine steht, will es einfach nicht klappen.
Sie ist aber natürlich als User eingetragen und auch vom Bot.

binford6000

Zitat von: ErzGabriel am 02 Mai 2020, 11:26:59
Es klappt noch nicht die Daten an meine Maus zu schicken.
Habe die Zeile entsprechend umgebaut aber es kommen die Daten immer noch bei mir an, sollen aber zu meiner Maus.
DoIF's, wo der Code im Define steht kann ich an meine Maus schicken lassen aber hier wo der Code in der Subroutine steht, will es einfach nicht klappen.
Sie ist aber natürlich als User eingetragen und auch vom Bot.
Zeig mal bitte den Code für DOIF und in der sub...