Klingel Event Auslösung über Netzwerk

  • Hallo,


    da mir die vorhandenen Lösungen mit RFID nicht gefallen haben, habe ich mir meine eigene Lösung ( etwas ausgeufert) gebaut. Dafür habe ich jetzt ein Türmodul, das die RFID Tag's an der Türe einließt und über LAN an einer Zentrale rückmeldet. bei diesem Türodul habe ich auch den Klingeltaster implementiert. Aktuell wählt sich mein Türmodul in der Fritzbox ein und löst ein Klingeln der Telefone aus, allerdings ohne Sprechfunktion. Als letzten Schritt möchte ich jetzt noch mein Türmodul mit doorpi verbinden.

    Meine Frage ist jetzt wie kann ich jetzt über Netwerk ein Klingel Event am Doorpi auslösen.


    rookie

    • Offizieller Beitrag

    Was du suchst ist die Aktion url_call (https://github.com/motom001/Do…SingleActions/url_call.py) Parameter ist die URL plus ggf Benutzer und Passwort ( : und @ entsprechend nutzen)


    Aaaber ich hab gerade beim Überfliegen des Quellcodes gesehen, dass sich da ein Fehler eingeschlichen hat (s.U. für die Korrektur) und nur der Fall behandelt wird, dass man die URL mit Nutzerdaten aufruft (Leerzeichen stimmen nicht). Muss motom001 mal ein paar Sachen weitergeben, dass er die im git ändert.


    • Offizieller Beitrag

    Ich hab dir da die Korrektur für die url_call.py gepostet ... damit stimmt die Einschränkung nicht mehr (wenn du es anpasst).
    Also. URI ist dir ein Begriff?


    Code: Mit Benutzer
    http://username:password@webseite.org/script.php?action=submit&pageid=86392001
    Code: Ohne Benutzer
    http://www.example.org/script.php?action=submit&pageid=86392001

    die url_call-Aktion nimmt aus der URI entsprechend den Nutzernamen und das Passwort.

  • irgendwie hat es bei mir die gepostete Korrektur nicht angezeigt.


    Super, danke für die schnelle Hilfe. Auf Doorpi-Seite geht erst mal alles, jetzt muss ich in meinem Türmodul die Funktionen noch implementieren, und im Doorpi schauen wie ein virtuelles Keyboard eingerichtet wird, da ich jetzt das piface nicht mehr benötige

  • Jetzt brauch ich doch noch mal hilfe

    Wenn ich im browswer die Zeile eingebe

    http://192.168.178.22/dopirec

    dann reagiert meien Türeinheit darauf, wenn ich aber den Befehl mit Doorpi auslöse passiert nichts.

    Hab ich da noch einen Fehler im Aufbau des URL befehl ?


    Code: doorpi.ini
    [onboardpins_InputPins]
    1 = out:Tueroeffner,1,0,3
    3 = url_call:http://192.168.178.22/dopirec




    debug

    • Offizieller Beitrag

    Hm dein Aufruf kommt hin, die Parameter die er bekommt stimmen auch. Einen Fehler wirft er auch nicht. Merkwürdig. Kannst du mal ne Python Konsole öffnen und das eingeben:

    Python: Konsole
    import urllib2
    response = urllib2.urlopen('http://192.168.178.22/dopirec')
    print "Response:", response 
    print "The URL is: ", response.geturl() 
    print "response code: ", response.code 
    print "headers: ", response.info()
  • hab ich oben schon geändert

  • Grundsätzlich wird jetzt erstmal der Aufruf empfangen und im Debug fenster ausgegeben

    Später wird die Türe geöffnet


    ist jetzt c++

    Code
    //Doorpi device
    server.on ( "/dopirec", handle_doorpirec);
    
    // doorpi handle 
    void handle_doorpirec() {
        server.sendHeader("Connection", "close");
        // Empfangen
        Serial.println("Botschaft von Doorpi");
    }
  • ich hab jetz nochmal meinen code erweitert jetzt kommt folgende antwort


    aber mit dem url aufruf geht es immer noch nicht

    Code
    >>> import urllib2
    >>> response = urllib2.urlopen('http://192.168.178.22/dopirec')
    >>> print "Response:", response 
    Response: <addinfourl at 1985571336 whose fp = <socket._fileobject object at 0x7693d7b0>>
    >>> print "The URL is: ", response.geturl() 
    The URL is:  http://192.168.178.22/dopirec
    >>> print "response code: ", response.code 
    response code:  200
    >>> print "headers: ", response.info()
    • Offizieller Beitrag

    Etwas ungünstig direkt nicht wirklich was zu senden. Ne erfolgreiche Meldung zB.

    C: ESP8266
    //Doorpi device
    server.on("/dopirec", handle_doorpirec);
    // doorpi handle 
    void handle_doorpirec() 
    { 
        Serial.println("Botschaft von Doorpi");
        server.send(200, "text/plain", "doorpirec ok")
    }

    Timeout für den Aufruf ist 1 Sekunde, das reicht aber bei dir? Eigtl. sollte urlopen eine URLError oder HTTP Exception werfen, wenn er damit unzufrieden ist. (Was er ja auch aus der Konsole macht). Solange der mit deinem "Webserver" unzufrieden ist, wird das nicht funktionieren. Wundert mich nur, dass du keinen Aufruf auf der Gegenseite bekommst weil fürs meckern bei der Antwort muss er diese ja bekommen haben.

  • Folgende Änderung habe ich gestern noch eingepflegt, was ja fast deinem Vorschlag entspricht und dem Log in post #15.

    C: ESP32
    // doorpi handle
    void handle_doorpirec() {
        server.sendHeader("Connection", "close");
        server.send(200, "text/plain", "ok");
        // Empfangen
        Serial.println("Botschaft von Doorpi");
    }

    Über die Konsole oder den Webbrowser hat es auch funktioniert nur nicht mit dem url-call

    Das mit der Sekunde muss ich nochmal überprüfen, mir kam es so vor wie wenn der Aufruf über die Konsole länger gedauert hätte

  • So ich konnte das Problem jetzt lösen

    Zum Teil persönliche Unfähigkeit zum anderen Teil vermutlich ein Bug


    Zuerst habe ich nicht gesehen das die gepostete Änderung eine falsche Einrückung des return befehl behoben hat,

    zum anderen konnte er mit der Variablen Übergabe im url-Aufruf nicht umgehen


    Python: url_call.py
            logger.info('url: %s' % url)
            data=None
            timeout=1
            return urllib2.urlopen(
                url,
                data,
                timeout
                )

    Leider konnte ich es in der Konsole nicht nachstellen, bzw hat es dort auch einmal zu einem Fehler geführt

  • Da geb ich dir recht.

    Aber es ist auch nicht falsch da der dritte Parameter von urllib2.urlopen auch der Timeout ist.



    urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

    Die ursprüngliche Variante hat bei mir einfach nicht funktioniert .

    Aber das heißt aber gar nichts, da bin ich einfach nicht Profi genug

    Fürs erste geht es mal, und vielleicht hat ja jemand noch eine bessere Idee.