Dash Button

Moin Jürgen,

danke für dein Script … läuft 1A !

VG

Andreas

Hi,

ich habe den Button ganz einfach per Amazon App konfiguriert, bis zu dem Punkt, wo ich das Produkt auswähle. Dann habe ich abgebrochen. Somit kommt der Button schon mal ins WLAN.

Nun läuft ein Script das Pingt den Button einfach alle 5 Sek. an, sobald ein Ping da war, dann kann ich ne Aktion starten.
Ist rel. einfach, aber dafür brauch ich keinen extra Raspberry.

Vielleicht nicht ganz so sauber, funktioniert aber bei mir problemlos.

Hallo Jürgen,

hast du ne Idee wie ich das Script anpassen muss, wenn ich da zwei oder mehr Dash Buttons integrieren will :0)

Habs so versucht … klappt aber nicht :0(

import datetime
import logging
import urllib2

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

def button_pressed_dash1():
 current_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
 print 'Dash button pressed' + current_time
 urllib2.urlopen('http://127.0.0.1:3777/hook/cottonelle?cottonelle')

def button_pressed_dash2():
 current_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
 print 'Dash button pressed' + current_time
 urllib2.urlopen('http://127.0.0.1:3777/hook/sheba?sheba')

def udp_filter(pkt):
 options = pkt[DHCP].options
 for option in options:
  if isinstance(option, tuple):
   if 'requested_addr' in option:
   # we've found the IP address, which means its the second and final UDP request, so we can trigger our action
    mac_to_action[pkt.src]()
    break

mac_to_action = {'ac:63:be:xx:22:22' : button_pressed_dash1}
mac_id_list = list(mac_to_action.keys())

mac_to_action = {'ac:63:be:xx:11:11' : button_pressed_dash2}
mac_id_list = list(mac_to_action.keys())

print "Waiting for a button press..."
sniff(prn=udp_filter, store=0, filter="udp", lfilter=lambda d: d.src in mac_id_list)

if __name__ == "__main__":
 main()

VG

Andreas

@Jürgen,

zufällig genau parallel dasselbe gebaut.
In IPS ein Empfängerscript und fertig.

Günstiger geht’s eigentlich nicht einen Dash Button kaufen für rund 5 EUR, dann noch Gutschrift bei erster Bestellung kassieren und anschließend einfach in der FritzBox sperren.

einwandfrei. Sicher nicht für Nutzung 10x pro Tag aber für einen gelegentlichen Button, absolut top und günstiger geht’s wohl definiv nicht.

Für einen gute Nacht Button ist es perfekt

Gesendet von meinem iPhone mit Tapatalk

Hat auch kein anderer ne Idee wie ich zwei oder mehr Buttons in das o.g. Script einbauen kann :0(

Hallo Zusammen,

ich habe das auch so gemacht wie von Joschi79 beschrieben. Unschön daran ist allerdings, dass sofern der Button nicht fertig inkl. Produkt konfiguriert ist, bei jedem Tastendruck eine PUSH Nachricht des Herstellers am Handy bei mir ankommt. Ich habe bisher keine Einstellmöglichkeiten gefunden, dass man granular nur diese Push Nachricht unterbinden kann. Also entweder alle oder keine.

Reset des nicht komplett konfigurierten Dash’s durch Hersteller:
Was ich weiter als mögliche Einschränkung sehe ist, dass wenn man das „nach Hause Telefonieren“ des Dash nicht per Firewall Einstellungen unterbindet es passieren könnte, dass der Knopf bei der nächsten Kontaktaufnahme wieder von dem Hersteller resettet werden könnte. Denn wenn man einen Dash über das App deaktiviert, dann wird dieser auch bei der nächsten Kontaktaufnahme resettet.

Und wo ist der Nachteil, das nach Hause telefonieren zu unterbinden?

Kann der Dash nach Hause telefonieren geht nach einem Tastendruck kurz die LED des Dash’s solange an, bis die Verbindung aufgebaut und der Datentransfer bestätig ist. Danach geht der Dash wieder offline. Ist kein Produkt hinterlegt, blinkt die LED noch einmal kurz rot zum Abschluss auf. Dauer insgesamt ca. 3 Sekunden bei mir, in der der Dash auch per Ping erreichbar ist.

Wenn man allerdings die Kommunikation zum Hersteller unterbindet (egal ob reject oder drop), dann ist der Dash ca. 30s online (auch die LED leuchtet dann ca. 30 Sekunden) bis der Timeout greift und der Dash dann wieder offline geht.

Wenn ich irgend etwas damit schalten möchte mit Betriebszeiten von vielleicht 10min oder länger ist das kein Problem. Allerdings schnell mal ein Licht ein und wieder ausschalten geht dann leider nicht, da der Butten mindestens 30 Sekunden online geht. Also eine sichere Schaltfrequenz von unter ca. 40 Sekunden klappt leider nicht.

Aber davon abgesehen, für viele Anwendung ist das Ding klasse!

So nachdem ja keiner geantwortet hat :stuck_out_tongue: … hab ich es hinbekommen :smiley:

import datetime
import logging
import urllib2

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

def button_pressed_dash1():
 current_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
 print 'Dash button pressed' + current_time
 urllib2.urlopen('http://127.0.0.1:3777/hook/cottonelle?cottonelle')

def button_pressed_dash2():
 current_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
 print 'Dash button pressed' + current_time
 urllib2.urlopen('http://127.0.0.1:3777/hook/sheba?sheba')

def udp_filter(pkt):
 options = pkt[DHCP].options
 for option in options:
  if isinstance(option, tuple):
   if 'requested_addr' in option:
   # we've found the IP address, which means its the second and final UDP request, so we can trigger our action
    mac_to_action[pkt.src]()
    break

mac_to_action = {'ac:63:be:xx:xx:xx' : button_pressed_dash1, 'ac:63:be:yy:yy:yy' : button_pressed_dash2}
mac_id_list = list(mac_to_action.keys())

print "Waiting for a button press..."
sniff(prn=udp_filter, store=0, filter="udp", lfilter=lambda d: d.src in mac_id_list)

if __name__ == "__main__":
 main()

Hab jetzt noch ne bessere Option gefunden, weil das andere Script bei mir immer dreimal ausgeführt worden ist.
Einfach noch

sudo apt-get install python-pydhcplib

installieren und folgendes Script anlegen

import urllib2

from pydhcplib.dhcp_network import *

def dash1():
        print("button has been pressed")
        urllib2.urlopen('http://127.0.0.1:3777/hook/cottonelle?cottonelle')

def dash2():
        print("button has been pressed")
        urllib2.urlopen('http://127.0.0.1:3777/hook/sheba?sheba')


netopt = {'client_listen_port':"68", 'server_listen_port':"67", 'listen_address':"0.0.0.0"}

class Server(DhcpServer):
        def __init__(self, options, dashbuttons):
                DhcpServer.__init__(self, options["listen_address"],
                                                                options["client_listen_port"],
                                                                options["server_listen_port"])
                self.dashbuttons = dashbuttons

        def HandleDhcpRequest(self, packet):
                mac = self.hwaddr_to_str(packet.GetHardwareAddress())
                self.dashbuttons.press(mac)


        def hwaddr_to_str(self, hwaddr):
                result = []
                hexsym = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
                for iterator in range(6) :
                        result += [str(hexsym[hwaddr[iterator]/16]+hexsym[hwaddr[iterator]%16])]
                return ':'.join(result)

class DashButtons():
        def __init__(self):
                self.buttons = {}

        def register(self, mac, function):
                self.buttons[mac] = function

        def press(self, mac):
                if mac in self.buttons:
                        self.buttons[mac]()
                        return True
                return False


dashbuttons = DashButtons()
dashbuttons.register("ac:63:be:aa:aa:aa", dash1)
dashbuttons.register("ac:63:be:bb:bb:bb", dash2)
server = Server(netopt, dashbuttons)

while True :
    server.GetNextDhcpPacket()

Hallo Zusammen!

Die Batterie vom DASH war leider schon nach kurzer Zeit leer. LED hat nach dem Drücken kurz aufgeleuchtet und er hat keine Verbindung mehr zum WLAN Netz mehr versucht. Wie allgemein bereits bekannt, ist in der zweiten Generation (Model No. JK29LP) eine normale AAA 1,5 Volt Duracell Batterie in einer Halterung verbaut. Nachdem ich leider nirgendwo finden konnte, wie man den DASH nach Möglichkeit zerstörungsfrei öffnet, habe ich es dann auf eigene Faust versucht.

Mit einem stabilen, scharfen Messer habe ich mich mit ein paar Schnitten in den zwei Nuten für den Rahmen bis in den Innenraum des DASH vorgearbeitet. Dann kann man einfach den Rest aufhebeln (keine Schrauben, keine Klips usw… – Deckel ist mit Ultraschall am Rand au das Gehäuse geschweißt), Batterie tauschen und mit etwas Sekundenkleber das Gehäuse fast unsichtbar wieder verschließen.

Gruß Dirk

COOL!
Vielen Dank!
Ich kann jetzt mein Radio über einen Ariel-Button ein- und ausschalten… oh man wie unnütz :smiley:

Gruß
Suner

Hi,

ich hab das so gelöst.

<?php

    $id_variable = 36906 /*[DashButton\Gillette - Wintergarten]*/;
    $st_variable = GetValue($id_variable);
    $var_info = IPS_GetVariable($id_variable);
    $now = $newTime = strtotime('-1 minute');
    
    if ($var_info['VariableUpdated'] < $now) {
        if ($st_variable == false) {
            SetValue($id_variable, true);
        } else {
            SetValue($id_variable, false );
        }
    }


?>

Hallo,

ich bin neu hier, also lerne das System erst kennen.

Ich bekomme das Skript nich zum laufen, liegt an einem Parse Error bezogen auf die Urllib2, hat eienr eine Idee?

Gruss

Der PHP-Parser kann den Code nicht interpretieren. Du musst erst den Fehler beheben. :rolleyes:

Wenn du uns die exakte Fehlermeldung verrätst können wir dir vielleicht auch sagen was sie genau bedeutet und wo du suchen musst. :wink:

Gruß,

Toni

Danke, ich werde es heute Abend mal Posten

Ich habe folgendes getan:

sudo apt-get install python-pydhcplib

dann das Script:


import urllib2
from pydhcplib.dhcp_network import *

def dash1():
        print("button has been pressed")
        urllib2.urlopen('http://127.0.0.1:3777/hook/cottonelle?cottonelle')

def dash2():
        print("button has been pressed")
        urllib2.urlopen('http://127.0.0.1:3777/hook/sheba?sheba')


netopt = {'client_listen_port':"68", 'server_listen_port':"67", 'listen_address':"0.0.0.0"}

class Server(DhcpServer):
        def __init__(self, options, dashbuttons):
                DhcpServer.__init__(self, options["listen_address"],
                                                                options["client_listen_port"],
                                                                options["server_listen_port"])
                self.dashbuttons = dashbuttons

        def HandleDhcpRequest(self, packet):
                mac = self.hwaddr_to_str(packet.GetHardwareAddress())
                self.dashbuttons.press(mac)


        def hwaddr_to_str(self, hwaddr):
                result = []
                hexsym = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
                for iterator in range(6) :
                        result += [str(hexsym[hwaddr[iterator]/16]+hexsym[hwaddr[iterator]%16])]
                return ':'.join(result)

class DashButtons():
        def __init__(self):
                self.buttons = {}

        def register(self, mac, function):
                self.buttons[mac] = function

        def press(self, mac):
                if mac in self.buttons:
                        self.buttons[mac]()
                        return True
                return False


dashbuttons = DashButtons()
dashbuttons.register("ac:63:be:aa:aa:aa", dash1)
dashbuttons.register("ac:63:be:bb:bb:bb", dash2)
server = Server(netopt, dashbuttons)

while True :
    server.GetNextDhcpPacket()  

Und erhalte folgedne Fehlermeldung:

Parse error: syntax error, unexpected ‚urllib2‘ (T_STRING) in /var/lib/symcon/scripts/21581.ips.php on line 2

Hallo,

keiner einen Hinweis für mich?

Das skript ist aber kein PHP, sondern Python. Das wird so nich gehen?!

Hmm das Skript ist aus dem Threat, wo liegt den der Fehler?

Ich hab son Teil nicht. Aber ich sehe, dass das Skript von einem Raspi gestartet wird?!

Ich bin jetzt nur auf deine Fehlermeldung eingegangen. Vllt mal den Text richtig lesen? :smiley: