Vorraussetzungen:
- libcrypt-ssleay-perl muss installiert werden (Unter Updates -> siehe Anhang)
- WireGate-Serverprozess unter Status -> restarten
- Plugin
- Prowl Account API-Key & APP
- ein i*
Funktion:
- Bei empfang einer Gruppenadresse wird ein fixer Text versendet
- Per UDP-Paket im Format "Prio;Event;Description;Application\n"
(z.B. für Geräte die Schwierigkeiten mit ssl haben
)
Makki
P.S.: Nein, ich habe kein iPhone..
- libcrypt-ssleay-perl muss installiert werden (Unter Updates -> siehe Anhang)
- WireGate-Serverprozess unter Status -> restarten
- Plugin
- Prowl Account API-Key & APP
- ein i*
Funktion:
- Bei empfang einer Gruppenadresse wird ein fixer Text versendet
- Per UDP-Paket im Format "Prio;Event;Description;Application\n"
(z.B. für Geräte die Schwierigkeiten mit ssl haben
)Code:
# Plugin um Nachrichten an Prowl zu senden
# Version: 0.1 2010-10-14
# Benötigt einen Prwol-Account sowie API-Key
##################
### DEFINITION ###
##################
my $socknum = 8; # Eindeutige Nummer des Sockets
# Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
$plugin_info{$plugname.'_cycle'} = 300;
my %options = ();
$options{'apikey'} = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; # Prowl API-Key
# Zwei Möglichkeiten zur Nutzung:
# VARIANTE 1: Bitwert auf GA sendet fixes Nachricht:
my %prowl_ga; # Eintrag darf nicht auskommentiert werden, solange nachfolgend keine GA definiert erfolgt kein Versand!
$prowl_ga{'14/5/208'} = '0;Event;Description;Application'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
# VARIANTE 2: Plugin horcht auf UDP-Port und empfängt Format PRIO;Event;Description;Application\n
my $recv_ip = "0.0.0.0"; # Empfangs-IP
my $recv_port = "50018"; # Empfangsport
#######################
### ENDE DEFINITION ###
#######################
# Hauptverarbeitung
if (!$socket[$socknum]) { # socket erstellen
if (defined $socket[$socknum]) { #debug
if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
undef $socket[$socknum];
} #debug
$socksel->remove($socket[$socknum]);
$socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
Proto => "udp",
LocalAddr => $recv_ip,
ReuseAddr => 1
)
or return ("open of $recv_ip : $recv_port failed: $!");
$socksel->add($socket[$socknum]); # add socket to select
$plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
# subscribe GA's
while( my ($k, $v) = each(%prowl_ga) ) {
# Plugin an Gruppenadresse "anmelden"
$plugin_subscribe{$k}{$plugname} = 1;
}
return "opened UDP-Socket $socknum";
}
if (%msg) { # telegramm vom KNX
if ($msg{'apci'} eq "A_GroupValue_Write" and $prowl_ga{$msg{'dst'}}) {
return sendProwl($prowl_ga{$msg{'dst'}});
}
} elsif ($fh) { # UDP-Packet
my $buf = <$fh>;
chomp $buf;
return sendProwl($buf);
} else {
# cyclic/init/change
# subscribe GA's
while( my ($k, $v) = each(%prowl_ga) ) {
# Plugin an Gruppenadresse "anmelden"
$plugin_subscribe{$k}{$plugname} = 1;
}
return; # ("return dunno");
}
sub sendProwl {
($options{'priority'},$options{'event'},$options{'description'},$options{'application'}) = split ';',shift;
use LWP::UserAgent;
$options{'priority'} ||= 0;
$options{'application'} ||= "WireGate KNX"; # Application fuer Telegramme
# URL encode our arguments
$options{'application'} =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
$options{'event'} =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
$options{'notification'} =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
# Generate our HTTP request.
my ($userAgent, $request, $response, $requestURL);
$userAgent = LWP::UserAgent->new;
$userAgent->agent("WireGatePlugin/1.0");
$requestURL = sprintf("https://prowl.weks.net/publicapi/add?apikey=%s&application=%s&event=%s&description=%s&priority=%d",
$options{'apikey'},
$options{'application'},
$options{'event'},
$options{'notification'},
$options{'priority'});
$request = HTTP::Request->new(GET => $requestURL);
$response = $userAgent->request($request);
if ($response->is_success) {
return "Notification successfully posted: $options{'priority'},$options{'event'},$options{'description'},$options{'application'}";
} elsif ($response->code == 401) {
return "Notification not posted: incorrect API key.";
} else {
return "Notification not posted: " . $response->content;
}
}
return;
P.S.: Nein, ich habe kein iPhone..



Kommentar