Amazon Dash Botton als Auslöser nutzen ( IFTTT / Tasker / ARP / python)

B

bastler123

Neues Mitglied
0
Hallo,

erstmal bin ich ein totaler Anfänger, was Android angeht.. ein paar Spielereien (root, tasker etc) habe ich bereits erfolgreich probiert... aber alles nur kleine Spielereien ^^
Ich versuche mein Heim mit kleinen Android-"Spielereien" etwas smarter zu machen...(möglichst günstig)
ein gerootetes Amazon-Fire 5 dient dabei als Schaltzentrale für Musik etc

-> zu meiner Frage:

Es gibt, zum Dash-Button einige "Hacks", dass der Knopfdruck durch ein python-skript erkannt (ARP) wird und dadurch ein Ereignis ausgelöst wird, jedoch nutzen die meisten ein Raspberry Pi oder ähnliches ... (s. Links)

Jedoch sollte das alles auf einem Android-Device laufen..

Ist das möglich ? geht es einfacher ?

Eigentlich möchte ich nach Hause kommen, den Knopf drücken und der Dashbutton soll meinem Tablet/Handy sagen: Spiel die Musik ab, schreib xyz eine sms "ich bin zu hause" etc... öffne App so und so
ODER öffne Webseite "maker.ifttt.com" um halt solch einen IFTTT-Event auszulösen

Links:
How to hack Amazon's Wifi button for IFTTT
How I Hacked Amazon’s $5 WiFi Button to track Baby Data
Explore and add IFTTT Recipes - IFTTT

Vielen Dank schon mal !

Grüße !
Robert
 
also das python skript aus beispiel 1 lässt sich auch auf android ausführen (ob es allerdings wirklich funtkioniert kann ich mangels dieses buttons nicht testen, denke aber schon). Zum ausführen einfach die termux app und dort python 2 oder 3 installieren (python 3, statt urllib2 nur urllib und print in () ). Braucht allerdings root rechte (wg. socket)
 
Ok ^^'
das ist schon mal schön :D

Die App läüft, bzw habe ich auch noch qphython gefunden...aber bei
vetzki schrieb:
(python 3, statt urllib2 nur urllib und print in () ). Braucht allerdings root rechte (wg. socket)
steige ich dann aus ^^
bei qphython kann ich noch skrips importieren, jedoch kommen dann auch Fehlermeldungen... da sind wir wieder bei totaler Anfänger ^^

gibt es die Möglichkeit das python-skipt dauerhaft im hintergrund laufen zu lassen ...oder eine APK zu schreiben, die das selbe macht ?
quasi -> suche ARP, wenn MAC 00.00.00.00.00.00 dann rufe maker.ifttt.com" auf

grüße
 
du könntest bei der termux app auch einfach python2 installieren (mir ist aufgefallen das sonst noch weitere änderungen nötig wären zumindest alles was urllib2 betrifft). Also termux aus dem play store oder fdroid installieren, apt update und dann apt install python2, dann su rechte holen (und was bei mir als root noch nötig ist k.a. ob das generell so ist, denke aber schon `export LD_LIBRARY_PATH=pfad_zur_data_termux_ordner/files/usr/lib` ). Das skript dann nur in einer textdatei (oder besser mit endung .py) speichern und mit python /pfad/zum/skript ausführen

Was anderes hättest du denn ein ifttt (ich hab das auch noch nie benutzt) "Rezept" (oder wie das heißt) gefunden welches Musik abspielen kann bzw. kannst dort selbst eines erstellen, welches mit deiner "musikplayerapp" funktioniert ?

Das python skript an sich läuft eigentlich in einer dauerschleife sobald es gestartet wurde (das starten nach dem booten könnte z.b. tasker oder ähnliches, evtl. ifttt auch)

Mit tasker (oder anderen ähnlichen apps, hab selbst nur taskter) solte das z.b. auch gehen, wenn das skript z.b. statt zum ifttt server senden z.b. einen shell befehl auslöst und damit einen taskertask startet
 
Vielen Dank vetzki, lese mich gerade ein bisschen ein
werd mich heute Abend noch einmal ran setzen ^^

Das ich mit dem Skript einen shell befehl für Tasker auslösen kann ist natürlich super, dann spar ich mit ja den Umweg über ifttt, und nehme nur den Tasker
Werd ich mir mal angucken !

zu ifttt: man kann sehr viele einfache "wenn - dann" Rezepte erstellen, auch zB den Tasker(Tablet) triggern, wenn ich noch unterwegs bin (Handy)
das schöne an ifttt, sind auch die vielen Schnittstellen z.B zu Gmail/twitter
ich wollte quasi einen Maker(http) anfrage senden lassen, welche die ifttt-App empfängt, bzw der tasker drauf reagiert um meine Musik zu starten/wlan an etc...

Werde mich nochmal melden, wenn ich es hin bekommen habe oder wenn ich verzweifelt in der Ecke sitze ;)

grüße!
 
Ich hhab jetzt auch nochmal, da es mich interessiert, rumprobiert und es mit tasker und ping von anderen geräten z.b. so hinbekommen:

Termux:
-python3 installieren
- su so aufrufen:
alias su='/system/xbin/su --preserve-environment -c LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib exec /data/data/com.termux/files/usr/bin/bash --login'
su

Tasker: (hier als bsp xiia radio)
PlayRadio (6)
A1: Send Intent [ Action:com.vblast.xiialive.intent.action.PLAYBACK_RESUME Cat:None Mime Type: Data: Extra: Extra: Extra: Package: Class: Target:Service ]

Python:
Skript:
Code:
import socket
import subprocess
import time

# hier ip adressen der anderen geräte (feste ip's für die geräte im router festlegen)
ips = {
    '192.168.178.25' : 'Mein PC',
    '192.168.178.26' : 'Handy X',
    '192.168.178.45' : 'PC Y',
    '192.168.178.76' : 'Tablet Z'
}

def starttask(taskname):
    cmd = subprocess.getstatusoutput("am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -e task_name "+taskname)
    if cmd[0] != 0:
        # show error code
        print(cmd[0])

rawSocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)

while True:
    packet = rawSocket.recvfrom(2048)
    pingfrom = packet[1][0]
    if pingfrom in ips:
        # do something
        curtime = time.strftime("%H-%M-%S", time.localtime())
        print( "ping von %s um %s" %(ips[pingfrom],curtime) )
        starttask("PlayRadio")

das skript auf der sdkarte speichern (z.b. bla.py) und als root (oben wichtig sonst geht entweder python nicht [ohne LD_LIBRARY_PATH] oder am [warum? keine ahnung] ) mit python /sdcard/bla.py starten

edit:
wichtig bei dem beispiel ist nur 1 ping zu senden
 

Anhänge

  • Screenshot_20160902-114243.png
    Screenshot_20160902-114243.png
    12 KB · Aufrufe: 159
Zuletzt bearbeitet:
Wow,
danke für die Anleitung, allerdings habe ich gleich die ersten Probleme:
unter "/system/xbin/" existiert kein "su" liegt bei mir unter "/su/bin/su"

also:

"
alias su='/su/bin/su --preserve-environment -c LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib exec /data/data/com.termux/files/usr/bin/bash --login'
su
"

funktioniert -> er fragt nach SU-rechten, die er dann bekommt !

jedoch wenn ich dann mit "python /sdcard/ping_task.py" aufrufen will, sagt er mir
"bash: /data/data/com.termux/files/usr/bin/python Permission denied"

spinnt mein SuperSU ? oder habe ich einen fehler drin,

der root-Checker sagt, das mein Handy gerootet ist, hab seit dem auch keine updates gemacht
 
versuch mal nur ein ls /data ob das klappt als root oder ob auch permission denied kommt
 
Ok, habe einfach Termux nochmal instaliert und jetzt geht es, dein Ping-script funktioniert wunderbar ^^ danke, kann ich anderweitig noch verwenden ^^
nur leider senden die Dash Buttons keinen Ping ans Tablet..

also hab ich etwas rumgeschrieben, bekomme jetzt allerdings folgende Meldung:

python /sdcard/mix5.py
Traceback (most recent call last):
File "/sdcard/mix5.py", line 21, in <module>
rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))
File "/data/data/com.termux/files/usr/lib/python3.5/socket.py", line 134, in __init__
_socket.socket.__init__(self, family, type, proto, fileno)
PermissionError: [Errno 13] Permission denied
$


Das ist der Code der PY-Datei, habe jetzt aber python2 laufen (hoffe ich)
Code:
import socket
import struct
import binascii
import time
import json
import urllib
import datetime
import subprocess

macs = {
    '0C47C9E53B45' : 'dash_white',
    '44650DF1CCDA' : 'dash_black',
}

def starttask(taskname):
    cmd = subprocess.getstatusoutput("am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -e task_name "+taskname)
    if cmd[0] != 0:
        # show error code
        print(cmd[0])

rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))
while True:
    packet = rawSocket.recvfrom(2048)
    ethernet_header = packet[0][0:14]
    ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header)
    ethertype = ethernet_detailed[2]
    if ethertype != '\x08\x06':
        continue
    arp_header = packet[0][14:42]
    arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header)
    source_mac = binascii.hexlify(arp_detailed[5])
    source_ip = socket.inet_ntoa(arp_detailed[6])
    dest_ip = socket.inet_ntoa(arp_detailed[8])
    if source_mac in macs:
        curtime = time.strftime("%H-%M-%S", time.localtime())
        print( "task" )
        starttask("Home")

vlt siehst jemand den Fehler ? ^^
Vielen Dank, Grüße !
 
Zuletzt bearbeitet:
hast du evtl. nur die root rechte vergessen? Weil bei mir läufts das von dir (ein paar sachen die du nicht benutzt könntest du noch rauswerfen, z.b. import urllib [brauchts nur fürs senden zu ifttt], die curtime, source _ip und dest_ip variable
 

Anhänge

  • Screenshot_20160904-101419.png
    Screenshot_20160904-101419.png
    14,6 KB · Aufrufe: 162
Das könnte auch beim "Fire Tablet" klappen, termux hat sowohl nodejs 6.5 als auch libpcap-dev.

Ansonsten evtl. so (ich kann nur vom rechner "arp pings" senden keine ahnung ob sich die evtl. vom dasher unterscheiden denke nicht, sonst müsste man sich das paket mal anschauen:

Code:
import socket
import subprocess
import time
from struct import unpack
from binascii import hexlify

BUFFER_SIZE = 2048
LINUXPING = b'!"#$%&\'()*+,-./01234567'
WINPING = b'abcdefghijklmnopqrstuvwabcdefghi'

# python3

class Main:
  def __init__(self):
    # ips fuer ping hier
    self.ips = {
    '192.168.178.25' : 'Mein PC',
    '192.168.178.31' : 'Handy X',
    '192.168.178.45' : 'PC Y',
    '192.168.178.76' : 'Tablet Z'
    }
    # macs hier
    self.macs = {
    '0c47c9e53b45' : 'dash_white',
    '44650df1ccda' : 'dash_black',
    '081196cf4dec' : 'Mein PC'
    }

    try:
      s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))
      while True:
        self.arporping(s)
    except KeyboardInterrupt:
      print("\nBye")

  def checkping(self, data):
    isping = False
    if len(data) == 74:
        # WIN
        ping = unpack('>6s6s2s12s4s4s8s32s', data)
        #0 ?, 1 mac, 2 ?(typ?), 3?, 4 ip, 5 ip, 6 ? 7 = string
        source_mac = hexlify(ping[1]).decode()
        source_ip = socket.inet_ntoa(ping[4])
        dest_ip = socket.inet_ntoa(ping[5])
        string = ping[-1]
        if string == WINPING and source_ip in self.ips:
            isping = True

    if len(data) == 98:
        # Linux/Android
        ping = unpack('>6s6s2s12s4s4s41s23s', data)
        # 0?, 1 mac, 2 ?(typ?), 3?, 4 ip, 5 ip, 6 ? 7 = string
        source_mac = hexlify(ping[1]).decode()
        source_ip = socket.inet_ntoa(ping[4])
        dest_ip = socket.inet_ntoa(ping[5])
        string = ping[-1]
        if string == LINUXPING and source_ip in self.ips:
            isping = True

    if isping:
        #print(source_mac)
        #print(source_ip)
        #print(dest_ip)
        curtime = time.strftime("%H-%M-%S", time.localtime())
        print( "PING um %s von %s" %(curtime,self.ips[source_ip]) )
        self.starttask("PlayRadio")

  def arporping(self, s):
    data = s.recvfrom(BUFFER_SIZE)
    #print(len(data[0]))
    # ping win 74 bytes, linux 98 bytes
    if len(data[0]) == 74 or len(data[0]) == 98:
        self.checkping(data[0])

    elif len(data[0]) == 42:
        ethernet_header = data[0][0:14]
        ethernet_detailed = unpack(">6s6s2s", ethernet_header)
        arp_header = data[0][14:42]
        arp_detailed = unpack("2s2s1s1s2s6s4s6s4s", arp_header)
        ethertype, dest_mac = ethernet_detailed[2], ethernet_detailed[0]
        # dasher dest_mac überprüfen, brauchte das sonst unbebasichtige "arps" vom pc
        if ethertype != b'\x08\x06' or dest_mac != b'\xff\xff\xff\xff\xff\xff':
            return
        else:
            source_mac = hexlify(arp_detailed[5]).decode()
           """
            print ("****************_ETHERNET_FRAME_****************")
            print ("Dest MAC:        ", hexlify(ethernet_detailed[0]))
            print ("Source MAC:      ", hexlify(ethernet_detailed[1]))
            print ("Type:            ", hexlify(ethernet_detailed[2]))
            print ("************************************************")
            print ("******************_ARP_HEADER_******************")
            print ("Hardware type:   ", hexlify(arp_detailed[0]))
            print ("Protocol type:   ", hexlify(arp_detailed[1]))
            print ("Hardware size:   ", hexlify(arp_detailed[2]))
            print ("Protocol size:   ", hexlify(arp_detailed[3]))
            print( "Opcode:          ", hexlify(arp_detailed[4]))
            print ("Source MAC:      ", hexlify(arp_detailed[5]))
            print ("Source IP:       ", socket.inet_ntoa(arp_detailed[6]))
            print ("Dest MAC:        ", hexlify(arp_detailed[7]))
            print( "Dest IP:         ", socket.inet_ntoa(arp_detailed[8]))
            print( "*************************************************\n")
           """
            if source_mac in self.macs:
                curtime = time.strftime("%H-%M-%S", time.localtime())
                print( "ARP um %s von %s" %(curtime,self.macs[source_mac]) )
                self.starttask("PlayRadio")

  def starttask(self,taskname):
    cmd = subprocess.getstatusoutput("am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -e task_name "+taskname)
    if cmd[0] != 0:
        # show error code
        print(cmd[0])

if __name__ == "__main__":
  print("Beenden mit Strg+c")
  Main()
 

Ähnliche Themen

V
Antworten
11
Aufrufe
707
Cecoupeter
Cecoupeter
H
Antworten
2
Aufrufe
159
Hastenichgesehen
H
M
Antworten
23
Aufrufe
520
senior-ipaq
S
Zurück
Oben Unten