Ankündigung

Einklappen
Keine Ankündigung bisher.

WireGate-Plugin: Per Prowl Nachrichten aufs iPhone vom KNX

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] WireGate-Plugin: Per Prowl Nachrichten aufs iPhone vom KNX

    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 )

    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;
    Makki

    P.S.: Nein, ich habe kein iPhone..
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    #2
    Hoi Makki

    Lustig, ich hab' heut' das mit prowl und einem kleinen perl-script auch hinbekommen.

    Gleichzeitigkeit der Ereignisse.
    Und das mit dem libcrypt-ssleay-perl war ebenso.
    Wir haben wohl ähnliche Suchmuster im www.

    Tolles Plugin und (growl) prowl Notificationen sind echt hilfreich.
    Ich denke das wird's wohl bald auch für andere Plattformen geben.

    Liebe Grüsse
    Grüsse Bodo
    Fragen gehören ins Forum, und nicht in mein Postfach;
    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

    Kommentar


      #3
      Tja, sowas passiert.. Bei mir aber fremdgetriggert.. Dann kann ich das Projekt ja gleich in Deine Hände übergeben, ich muss zum testen immer Helmut anrufen

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Hoi Makki

        Hahaha, gute Idee, ich helfe gerne wenn ich kann.
        Allerdings hab' ich ja ausser dem eibd linknx und misterhouse sonst nix von Deinem Repository. (ausser unabsichtlich).
        Na vielleicht owfs noch, bin mir aber nicht sicher.

        Daher weiss ich gar nicht wie ich ein "Plugin" von Dir einsetzen kann, soll oder muss. Hehehe
        Grüsse Bodo
        Fragen gehören ins Forum, und nicht in mein Postfach;
        EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

        Kommentar


          #5
          @bodo : willst du prowl- (aufs iphone) oder growl- (auf windows-pc)nachrichten verschicken?

          für misterhouse und growl habe ich ja mal eine anleitung geschrieben, siehe
          https://knx-user-forum.de/code-schni...rschicken.html
          ABB SA/Sx.16.5S, BJ RCP 6136/100C-101, 1wire
          SOMFY Animeo KNX, eibd und misterhouse auf IBM netvista 8364
          , SB Radio, Archos 7 HomeTablet

          Kommentar


            #6
            Hoi Nino

            Nee alles klar, danke, ich hab bereits meine "eigene" prowl.pl integriert.
            http://blog.fupps.com/2009/11/12/pro...ith-an-iphone/
            Grüsse Bodo
            Fragen gehören ins Forum, und nicht in mein Postfach;
            EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

            Kommentar


              #7
              hi,

              also ich hab das mal jetzt versucht einzurichten, bis jetzt scheinen aber keine Nachrichten gesendet zu werden.

              Die API, Plugin und libcrypt hab ich eingetragen, eingerichtet ich wollte Var.2 nutzen, hab dem Plugin also die IP Adresse des WG eingetragen und den Port bei 50018 gelassen.

              Dann habe ich mit einem UDP sender mal eine Nachricht hallo z.b. hingesendet.

              Kann mir jemand weiterhelfen ?
              Gruss Mathias

              Kommentar


                #8
                Variante 1 funktioniert definitiv, ohne detaillierte Fehlermeldung: Schwierig..

                Makki
                EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                -> Bitte KEINE PNs!

                Kommentar


                  #9
                  Gibt es mittlerweile etwas vergleichbares für Android? Also nicht das Plugin, sondern einen Dienst zum Nachrichten verschicken? Am liebsten ohne Fremd-Server dazwischen

                  Schöne Grüße
                  Christiah

                  Kommentar


                    #10
                    Hier mal ein Logauszug

                    2011-08-06 09:18:13 120 112 0.3 opened UDP-Socket 8 0
                    Log:
                    2011-08-06 09:12:21.624,Prowl Versand,opened UDP-Socket 8,0.3s,
                    2011-08-06 09:13:46.636,Prowl Versand,opened UDP-Socket 8,0.6s,
                    2011-08-06 09:19:04.207,Thread,WARNING Thread exited TIMEOUT running PLUGIN Prowl Versand !
                    2011-08-06 09:19:20.456,Prowl Versand,opened UDP-Socket 8,0.3s,

                    Ich habe bei IP die des WG eingetragen, den API Key eingetragen. Portnummer und Socket habe ich nicht verändert.

                    Wie verläuft der Versand aus dem WG muss ich evtl. in meinem Router noch Ports freischalten damit das Plugin raussenden kann oder läuft das über Port 80 ?

                    Die Nachricht sah so aus welche ich mit dem UDP Sender geschickt habe
                    0;Test;test;hallo\n


                    Edit: Variante 1 funktioniert.... nun vielleicht bringen wir auch Variante 2 zum laufen
                    Gruss Mathias

                    Kommentar


                      #11
                      Moin,
                      Ich bastel zwischendurch auch mal an der Var1 rum und irgendwo finde ich zur Zeit kein Beispiel/Anleitung für die Verwendung von 14byte Texten.
                      Wenn ich mir die $msg{'data'} ansehe dann ist das nur ein Hex-String. Muß das native im Plugin umgesetzt werden oder fehlt mir da etwas?

                      Cu
                      Andreas
                      cu
                      Andreas


                      Aus dem Norden? Schau mal rein, Stammtisch-Nord!

                      Kommentar


                        #12
                        $msg{'data'} ist der Rohwert, $msg{'value'} ggfs. der dekodierte Klartext.

                        Also entweder die GA mit entsprechendem DPT 16.001 in der Konfig (GA Editor) eintragen und dann $msg{'value'} verwenden - sicherlich am einfachsten und saubersten.

                        Oder explizit beim lesen DPT angeben:
                        my $KlarText = knx_read("1/2/3", 3600, 16.001);
                        oder explizit mit angabe des DPT dekodieren
                        my $KlarText = decode_dpt(0,$msg{'data'},16.001);

                        Makki
                        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                        -> Bitte KEINE PNs!

                        Kommentar


                          #13
                          Zitat von makki Beitrag anzeigen
                          Also entweder die GA mit entsprechendem DPT 16.001 in der Konfig (GA Editor) eintragen
                          Ertappt, war in der ETS aber nicht im WG eingetragen. :-(

                          Zitat von makki Beitrag anzeigen
                          Oder explizit beim lesen DPT angeben:
                          Mit DPT 16 hatte ich gespielt, aber nicht mit 16.001.

                          Funktioniert jetzt mit beiden Möglichkeiten, hat nur noch diverse 00 am Ende.

                          Zitat von makki Beitrag anzeigen
                          $msg{'data'} ist der Rohwert, $msg{'value'} ggfs. der dekodierte Klartext.
                          Kannst du mir bitte einen Link dazu geben? Ich hatte da nix gefunden und nur aus den Beispielem geraten.
                          cu
                          Andreas


                          Aus dem Norden? Schau mal rein, Stammtisch-Nord!

                          Kommentar


                            #14
                            Zitat von arosy Beitrag anzeigen
                            Kannst du mir bitte einen Link dazu geben? Ich hatte da nix gefunden und nur aus den Beispielem geraten.
                            Ähm, da gibt's nichts. Das einzige wo wissentlich DPT16 verwendet wird ist in dem Chumby-Plugin.
                            Aber das ist auch sekundär, das ist nichts anderes als mit den 15 DPTs davor auch, viele Beispiele sind doch IMHO das beste

                            Makki
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar


                              #15
                              Ich habe das ganze für mich mal erweitert um Wertabhängig (0 oder 1) unterschiedliche Nachrichten zu verschicken, wenn Du deknst das macht Sinn so, kannst Du das ruhig einchecken:

                              Code:
                              # Plugin um Nachrichten an Prowl zu senden
                              # Version: 0.2 2011-12-03
                              # Benötigt einen Prowl-Account sowie API-Key
                              # 0.2 - erweitert um Wertunterscheidung
                              
                              ##################
                              ### 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'} = "xyzxyz";
                              
                              
                              # 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] = '0;Event-0;Description Hallo;Application'; # Priority,Event,Description,Application - ggfs. NUR DIESE Zeile auskommentieren!
                              $prowl_ga{'14/5/208'}[1] = '0;Event-1;Description Hallo;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'}}) {
                                      if ($msg{'data'} eq "00") {
                                              return sendProwl($prowl_ga{$msg{'dst'}}[0]);
                                      }
                                  elsif ($msg{'data'} eq "01") {
                                              return sendProwl($prowl_ga{$msg{'dst'}}[1]);
                                      }
                                }
                              } 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);
                                #$request->timeout(5);
                              
                                $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;
                              (Davon mal abgesehen wimmelt es in den meisten Plugins wie auch diesem nur so von falschen Zeilenumrüchen (CRLF))

                              Kommentar

                              Lädt...
                              X