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

  • freak83
    antwortet
    Hallo Zusammen,

    ich steh grad auf dem Schlauch, hat einer ein Screenshot was ich im HomeServer bei IP Telegramm senden eintragen muß?

    Einen Kommentar schreiben:


  • makki
    antwortet
    So isses, einfach mit knx_read(<GA>,0,<DPT>) lokal aus dem Cache lesen..

    Makki

    Einen Kommentar schreiben:


  • Astrafahrer
    antwortet
    Zitat von Astrafahrer Beitrag anzeigen
    Mein Ziel:
    Ich möchte für Wiregate - interne Sensoren (Temperatur, Feuchte) den Versand per Prowl nutzen. Ich weiß nicht so richtig wie ich die Werte und die Namen der Sensoren in das Prowl - Skript bekomme. Eventuell hat das schon jemand umgesetzt?
    Ich antworte mir mal selbst, eventuell sucht ja noch jemand danach; Das Thema ist hier schon ähnlich besprochen worden, der Weg führt also über die GA´s, auch wenn man noch kein KNX einsetzt. So habe ich es verstanden (aber noch nicht getestet).

    Einen Kommentar schreiben:


  • Astrafahrer
    antwortet
    Hallo zusammen,
    ich habe die aktuelle Version des Plugins (aus dem SVN) heute eingerichtet und der Versand der Prowl - Nachrichten funktioniert auch wenn ich testweise ein UDP - Paket an das Wiregate sende
    Code:
     echo .'0;ausgeschaltet;Description Hallo;Buero Beleuchtung'. > /dev/udp/192.168.17/50018
    Mein Ziel:
    Ich möchte für Wiregate - interne Sensoren (Temperatur, Feuchte) den Versand per Prowl nutzen. Ich weiß nicht so richtig wie ich die Werte und die Namen der Sensoren in das Prowl - Skript bekomme. Eventuell hat das schon jemand umgesetzt?

    Vielen Dank.

    Einen Kommentar schreiben:


  • chriss1980
    antwortet
    Ich hatte da auch mal gesucht... mein letzter Stand war, dass es zwar mittlerweile eine entsprechende API von Google gibt, aber keine Standard-App für das Smartphone.

    Einen Kommentar schreiben:


  • Lapheus
    antwortet
    Hallo zusammen,

    Ich habe gerade mal gesucht ob es Prowl auch fürs Android gibt.
    Bin aber nur auf "Leichen" gestossen.

    Hat jemand anderes etwas gefunden?

    Gruss
    Lapheus

    Einen Kommentar schreiben:


  • arosy
    antwortet
    Erstmal ist dies Plugin mal wieder eine Top-Gschicht, vielen Dank.

    Wo ich mir zur Zeit noch nicht so ganz einig bin ist die Reihenfolge der Parameter und damit die Anzeige.

    Zur Zeit habe ich das bei mir mal so laufen:

    $sock->send("1;$meldung;aro-wg;Unwetterwarnung\n");

    Das Orginal ist folgendes:

    $sock->send("0;Unwetterwarnung;Unwetterwarnung;$meldung\ n");

    Vielleicht können sich da ja mal die Prowl-Profis auslassen.

    Einen Kommentar schreiben:


  • ctr
    antwortet
    Zitat von makki Beitrag anzeigen
    Für eine dritte Variante: Übergabe des Wertes in die Meldung gäbe es sicher auch noch Anwendungsfälle..

    Makki
    ja das hatte ich mir auch schon überlegt, würde dann auch mit anderen Datentypen und man noch mehr Logik implemtieren (z.B. "<" und ">")...
    Bei mir gehts jetzt erstmal 'binär' wie in meinem Codeschnipsel (+vertauschen von description und notification)

    Was ich auch gern noch implentieren würde, wäre Versand von Growl per GNTP (um die Nachrichten auch auf dem Rechner zu haben), dafür gibt es eine Perl-Lib...

    Einen Kommentar schreiben:


  • makki
    antwortet
    Zitat von ctr Beitrag anzeigen
    wenn Du deknst das macht Sinn so, kannst Du das ruhig einchecken:
    Kann ich mangels eigener Nutzung nun kaum beurteilen, klingt aber sinnig
    Ich würde aber eine Sache dann gleich mit-ändern: sep. Meldungen für 0-255(bzw. auch mehr sofern der eingestellte DPT es hergibt)

    Änderungen rot, völlig ungetestet:
    Code:
    # Plugin um Nachrichten an Prowl zu senden
    # Version: 0.2[COLOR="Red"][COLOR="Red"]1[/COLOR][/COLOR] 2011-12-03
    # Benötigt einen Prowl-Account sowie API-Key
    # 0.2[COLOR="Red"]1[/COLOR] - 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: Wert auf GA sendet fixe 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![COLOR="Red"]
    # ...
    $prowl_ga{'14/5/208'}[5] = '0;Event-5;Description Hallo;Application'; # Priority,Event,Description,Application - Beispiel für Wert 5 auf der GA[/COLOR]
    #...
    
    # 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
    [COLOR="Red"]  if ($msg{'apci'} eq "A_GroupValue_Write" and $prowl_ga{$msg{'dst'}}[$msg{'data'}+0]) {
            return sendProwl($prowl_ga{$msg{'dst'}}[$msg{'data'}+0]);
      }
    [/COLOR]} 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;
    -> Wenn funktioniert bitte Feedback.

    (Davon mal abgesehen wimmelt es in den meisten Plugins wie auch diesem nur so von falschen Zeilenumrüchen (CRLF))
    Ja, teils sogar hausgemacht, stört die Plugins ansich aber nicht.. Die gretchenfrage: Was ist Falsch/Richtig, Windows (also 90% der AW) findet CRLF ja "richtig"
    Bevor darüber jetzt ein Krieg ausbricht (encoding ist noch spannener) kann man sich bis aufs optische hier auch ein Ei drauf pellen.

    Zitat von ctr Beitrag anzeigen
    Mal was anderes, kann es sein, dass Dir da bei der Übergabe in sendProwl $options{'description'} und $options{'notification'} durcheinandergekommen sind? description wird nirgendwo versendet, notification schon, aber das hat keinen Wert...
    Das kann sehr gut sein, das wurde mal so zwischen Tagesschau &Wetterkarte gemacht nach dem lesen der einfachen API mit einem Anwender kurz am Telefon getestet und fertig, ich weiss nichtmal wie das am Endgerät aussieht

    Für eine dritte Variante: Übergabe des Wertes in die Meldung gäbe es sicher auch noch Anwendungsfälle..

    Makki

    Einen Kommentar schreiben:


  • ctr
    antwortet
    Mal was anderes, kann es sein, dass Dir da bei der Übergabe in sendProwl $options{'description'} und $options{'notification'} durcheinandergekommen sind? description wird nirgendwo versendet, notification schon, aber das hat keinen Wert...

    Einen Kommentar schreiben:


  • ctr
    antwortet
    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))

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • arosy
    antwortet
    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.

    Einen Kommentar schreiben:


  • makki
    antwortet
    $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

    Einen Kommentar schreiben:


  • arosy
    antwortet
    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

    Einen Kommentar schreiben:

Lädt...
X