Momentan bastel ich an einem msgDialog Modul. Dafür benötige ich die eingehenden Nachrichten als Readings in den devices in denen ein entsprechndendes msgContactPush Attribut vorhanden ist.
Für das msgConfig Modul habe ich folgenden patch erstellt:
Index: FHEM/75_msgConfig.pm
===================================================================
--- FHEM/75_msgConfig.pm (Revision 15159)
+++ FHEM/75_msgConfig.pm (Arbeitskopie)
@@ -8,6 +8,7 @@
# initialize ##################################################################
sub msgConfig_Initialize($) {
my ($hash) = @_;
+ my $TYPE = "msgConfig";
require "$attr{global}{modpath}/FHEM/msgSchema.pm";
@@ -15,6 +16,7 @@
$hash->{SetFn} = "msgConfig_Set";
$hash->{GetFn} = "msgConfig_Get";
$hash->{UndefFn} = "msgConfig_Undefine";
+ $hash->{NotifyFn} = $TYPE."_Notify";
# add attributes for configuration
no warnings 'qw';
@@ -179,6 +181,8 @@
readingsEndUpdate( $hash, 1 );
}
+ $hash->{NOTIFYDEV} = "TYPE=(Jabber|TelegramBot|yowsup)";
+
return undef;
}
@@ -551,6 +555,61 @@
return undef;
}
+sub msgConfig_Notify($$) {
+ my ($hash, $dev_hash) = @_;
+ my $SELF = $hash->{NAME};
+ my $TYPE = $hash->{TYPE};
+ my $device = $dev_hash->{NAME};
+
+ return if(IsDisabled($SELF));
+
+ my @events = @{deviceEvents($dev_hash, 1)};
+
+ return unless(@events);
+
+ foreach my $event (@events){
+ next unless($event =~ m/(msgText|queryData|(OTR)?LastMessage|message)/);
+ my ($recipient, $received);
+ my $dev_TYPE = $dev_hash->{TYPE};
+
+ if($dev_TYPE eq "TelegramBot" && $event =~ m/^msgText/){
+ $recipient = ReadingsVal($device, "msgPeerId", undef);
+ $received = ReadingsVal($device, "msgText", undef);
+ }
+ elsif($dev_TYPE eq "TelegramBot" && $event =~ m/^queryData/){
+ $recipient = ReadingsVal($device, "queryPeerId", undef);
+ $received = ReadingsVal($device, "queryData", undef);
+ }
+ elsif($dev_TYPE eq "Jabber" && $event =~ m/^((OTR)?Last)Message/){
+ $received = ReadingsVal($device, $1."Message", undef);
+ ($recipient) = (ReadingsVal($device, $1."SenderJID", undef) =~ m/[^\/]+/g);
+ }
+ elsif($dev_TYPE eq "yowsup" && $event =~ m/^message/){
+ $recipient = $device;
+ $device = $modules{yowsup}{defptr}{yowsup}->{NAME};
+ $received = ReadingsVal($device, "message", undef);
+ }
+
+ next unless($recipient && $received ne "");
+
+ my @contacts = devspec2array("msgContactPush=.*$recipient.*");
+
+ if(@contacts){
+ foreach (@contacts){
+ my $contact_hash = $defs{$_};
+
+ readingsBeginUpdate($contact_hash);
+ readingsBulkUpdate($contact_hash, "fhemMsgPushReceived", $received);
+ # readingsBulkUpdate($contact_hash, "fhemMsgPushReceivedContact", $device);
+ readingsEndUpdate($contact_hash, 1);
+ }
+ }
+ }
+
+ return;
+}
+
+
# module Fn ####################################################################
sub MSG_FindAttrVal($$$$) {
my ( $d, $n, $msgType, $default ) = @_;
@@ -735,7 +794,7 @@
<li>
<b>createSwitcherDev</b> <de|en> <br>
Creates a pre-configured Dummy device named HouseAnn and updates globalMsg attribute msgSwitcherDev to refer to it.
-
+
</li>
</ul>
</ul>
Testen konnte ich das nur mit Telegram und Jabber. Prinzipiell wird aber auch noch Whatsapp unterstützt. Vielleicht könnte das noch jemand testen.
Gibt es noch weitere InstantMessaging Dienste die über den msg Befehl funktionieren? Die ganzen push Dienste funktionieren ja soweit ich weiß nur in eine Richtung.
Ein sehr guter Vorschlag, Danke!Ich finde den "Rückkanal" an dieser Stelle richtig platziert und habe deinen Patch in abgewandelter Form eingecheckt.
Zitat von: igami am 01 Oktober 2017, 14:44:27
Gibt es noch weitere InstantMessaging Dienste die über den msg Befehl funktionieren? Die ganzen push Dienste funktionieren ja soweit ich weiß nur in eine Richtung.
Jaein: Pushover hat einen Rückkanal für die Bestätigung von Meldungen. Habe ich bisher aber mal weg gelassen.
Was hälst du noch von folgendem DoTrigger
unless ( IsDevice($_) ) {
Log3 $name, 4, "msg $name: "
. "ERROR: Received $t message from $devName for non-existing recipient device $_";
DoTrigger($name, "ERROR: Received $t message from $devName for non-existing recipient device $_");
next;
}
Dann hat man auch die Möglichkeit sich durch ein notify darauf aufmerksam zu machen.
Zitat von: igami am 01 Oktober 2017, 20:14:48
Was hälst du noch von folgendem DoTrigger
Nee, nach genauerem Hinsehen macht das Logging an der Stelle überhaupt keinen Sinn, weil devspec2array() mir ja nur Geräte gibt, die es auch gibt.
Nur für den Fall, dass da fehlerhafte Device Hashes dabei sind lasse ich mal eine Prüfung an der Stelle.
Ansonsten habe ich den DoTrigger für dich weiter unten eingebaut.