Amazon Dash Button

Begonnen von gloob, 31 August 2016, 08:20:07

Vorheriges Thema - Nächstes Thema

Wzut

Zitat von: peterk_de am 06 September 2016, 10:44:02
2. Request-Package https://www.npmjs.com/package/request installieren (sudo npm install request)
hatte ich zuerst versucht , scheitere aber leider mit diesem Fehler :

npm http GET https://registry.npmjs.org/request
npm ERR! Error: failed to fetch from registry: request
npm ERR!     at /usr/share/npm/lib/utils/npm-registry-client/get.js:139:12
npm ERR!     at cb (/usr/share/npm/lib/utils/npm-registry-client/request.js:31:9)
npm ERR!     at Request._callback (/usr/share/npm/lib/utils/npm-registry-client/request.js:136:18)
npm ERR!     at Request.callback (/usr/lib/nodejs/request/main.js:119:22)
npm ERR!     at Request.<anonymous> (/usr/lib/nodejs/request/main.js:212:58)
npm ERR!     at Request.emit (events.js:88:20)
npm ERR!     at ClientRequest.<anonymous> (/usr/lib/nodejs/request/main.js:412:12)
npm ERR!     at ClientRequest.emit (events.js:67:17)
npm ERR!     at HTTPParser.onIncoming (http.js:1261:11)
npm ERR!     at HTTPParser.onHeadersComplete (http.js:102:31)
npm ERR! You may report this log at:
npm ERR!     <http://bugs.debian.org/npm>
npm ERR! or use
npm ERR!     reportbug --attach /root/arp/npm-debug.log npm
npm ERR!
npm ERR! System Linux 3.13.0-34-generic
npm ERR! command "node" "/usr/bin/npm" "install" "request"
npm ERR! cwd /root/arp
npm ERR! node -v v0.6.12
npm ERR! npm -v 1.1.4
npm ERR! message failed to fetch from registry: request
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /root/arp/npm-debug.log
npm not ok

Zitat von: justme1968 am 06 September 2016, 09:39:30
wäre es nicht einfacher auf das dhcp discover zu lauschen statt auf arp?
kann ich auch mal versuchen , ist nur ein String zu tauschen und pcap hat viele Filter Möglichkeiten ( man pcap-filter)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

peterk_de

Zitat von: Wzut am 06 September 2016, 11:01:12
hatte ich zuerst versucht , scheitere aber leider mit diesem Fehler :

npm ERR! node -v v0.6.12


Das müsste der Fehler sein. Viiiiiiiel zu alt! Bei mir:


~$ node -v
v4.5.0


Wie gesagt, das was bei den meisten Distros dabei ist, ist steinzeitlich.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

justme1968

#62
Zitatkann ich auch mal versuchen , ist nur ein String zu tauschen und pcap hat viele Filter Möglichkeiten ( man pcap-filter)

die idee wäre natürlich die ganzen pcap und sonstigen module weg zu lassen und auch das Blocking call. um root kommt man wegen port 67 leider nicht rum. aber alles andere sollte deutlich einfacher sein.

kannst du mal den folgenden code als root probieren und schauen ob etwas erkannt wird wenn der button aufwacht?
use strict;     
use warnings;   
               
use IO::Socket::INET;                                               
               
my $socket = IO::Socket::INET->new(LocalPort=>67, Proto=>'udp', Broadcast=>1, ReuseAddr=>1, ReusePort=>defined(&ReusePort)?1:0);
print "$@\n";   
               
while( 1 ) {   
  my ($datagram,$flags);                                             
               
  $socket->recv($datagram,1024,$flags);                             
  print "Got message from ", $socket->peerhost, ":", $socket->peerport, "\n";
               
  my ($op, $htype, $hlen, $hops, $xid, $secs, $flags ) = unpack ( 'CCCCNnn', $datagram );
  my $ciaddr = join '.', unpack ('C4', substr($datagram, 12 ) );     
  my $yiaddr = join '.', unpack ('C4', substr($datagram, 16 ) );     
  my $siaddr = join '.', unpack ('C4', substr($datagram, 20 ) );     
  my $giaddr = join '.', unpack ('C4', substr($datagram, 24 ) );     
  my $chaddr = join ':', unpack ('(H2)*', substr($datagram, 28, $hlen ) );
  print "  $op, $htype, $hlen, $hops, $xid, $secs, $flags, $ciaddr, $yiaddr, $siaddr, $giaddr, $chaddr\n";
}


das müsste in $chaddr jeweils die mac adresse stehen haben.

edit: es müsste zwei möglichkeiten geben um die root einschränkung zu umgehen:

- iptables -A PREROUTING -t nat -i eth0 -p udp --dport 67 -j REDIRECT --to-port 6767
  oder
  iptables -I PREROUTING -t nat -i eth0 -p udp --src 0.0.0.0 --dport 67 -j DNAT --to 0.0.0.0:6767
  um den port 67 auf 6767 umleiten und darauf lauschen -> port attribut setzen.

- über capabilities fhem die möglichkeit geben auch als nicht root den port 67  zu verwenden.
  ich weiss nicht ob das irgendwelche seiteteneffekte hat.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Lafarik

Zitat von: Wzut am 06 September 2016, 07:37:31
......
define myDash DashB
Ohne weitere Attribute lauscht das Modul auf Broadcast ARP Pakete an eth0 und erzeugt für jede gesehene MAC Adresse ein eigenes Reading (siehe Screenshot)
Möchte man nur bestimmte MAC Adressen auswerten (z.B. die Dash Buttons) so sind diese durch Komma getrennt dem Attribut mac zu übergeben :
attr myDash b47443267fb9,deadbeef0001

Danke für die Möglichkeit! Hab installiert und werde heute Abend mal testen.

Beim letzten Punkt hast du glaube ich "mac" vergessen:

attr myDash mac b47443267fb9,deadbeef0001
FHEM,FritzDECT,Z-Wave,LaCrosse,MQTT2,ConBeeII,ZigBee,EnOcean,Sonoff 4CH,NanoLeaf,LD382A,Sonos,Synology,IPCam,eBus3.0

Wzut

Zitat von: justme1968 am 06 September 2016, 13:15:11
das müsste in $chaddr jeweils die mac adresse stehen haben.
als user root ja :
Got message from 0.0.0.0:68
  1, 1, 6, 0, 168337944, 0, 0, 0.0.0.0, 0.0.0.0, 0.0.0.0, 0.0.0.0, dc:9f:db:75:aa:15

als "normaler User"
IO::Socket::INET: Keine Berechtigung
Can't call method "recv" on an undefined value at ./dhcp.pl line 12.


Zitat von: Lafarik am 06 September 2016, 13:21:46
Beim letzten Punkt hast du glaube ich "mac" vergessen:
das war volle Absicht um zu sehen ob ihr auch aufmerksam lest .... :) THX
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

justme1968

ja. um root kommt man wegen port 67 nicht rum. bzw. eventuell mit der oben angehängten iptables regel.

aber es fallen alle perl zusatz module weg und auch der BlockingCall ist nicht nötig. das socket muss nur in die fhem select loop eingehängt werden und das modul braucht eine readFn. das würde mir sehr viel besser gefallen.

vielleicht komme ich heute abend ja doch noch dazu.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Wzut

Zitat von: justme1968 am 06 September 2016, 15:37:50
eventuell mit der oben angehängten iptables regel.
habe ich knapp 30 Min laufen lassen ohne ein Paket auf 6767 zu sehen :(
BTW : wirklich -p tcp oder doch eher  -p udp ? ( habe beides erfolglos versucht)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

justme1968

ja. natürlich udp. hast du in dem beispiel code auch auf 6767 geändert?

ich habe es gerade mal zum testen probiert und ich sehe die dhcp broadcasts dann auf 6767.

du kannst ja mal zwei instanzen laufen lassen. auf 67 als root und auf 6767 als user.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

#68
anbei mal eine erste version eines moduls das die oben beschriebene dhcp variante verwendet. es sind keine perl zusatz module nötig.

- define anlegen mit: define dash dash_dhcp
- wenn fhem nicht als root läuft: die oben vorgeschlagene  iptables regel verwenden und das port attribut passend setzen
- in allowed die liste der erlaubten mac adressen setzen
- das modul legt für jeden erlaubten button ein reading mit der mac adresse an und dem inhalt short wenn die adresse erkannt wird.

gruss
  andre

ps: völlig ungetestet. mein dash button ist immer noch eingepackt :)

edit  2016-09-16: die readings verwenden jetzt einen - statt eines :. achtung: im allowed attribut ist es immer noch ein :
                           bessere fehlermeldung

edit 2016-09-08: openwrt nachrichten eingebaut (by malted)

edit 2016-10-11: modul eingecheckt
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

CarstenF

#69
Zitat von: malted am 01 September 2016, 16:26:01
So, ich hab es jetzt mal mit openwrt als Gateway zum Laufen gebracht.

Auf dem OpenWRT, an dem die Buttons hängen, startet man einfach das ohnehin vorhandene logread:

/sbin/logread -e ".* associated .*" -f -u -r 192.168.1.235 5555 -p /var/run/logread.1.pid

(Die IP-Adresse durch die Adresse vom FHEM-Server ersetzen.)
Das schickt die Einträge aus dem Syslog, auf die die Regexp passt, per UDP an den FHEM-Server.
Dauerhaft eintragen kann man es, wenn es funktioniert in der /etc/rc.local

Auf dem FHEM-Server habe ich dann einen Dummy angelegt.

define dash dummy

Und dann auf dem FHEM-Server das folgende Proxy-Script gestartet:


#!/usr/bin/perl -w
#
use strict;
use IO::Socket;
my($sock, $newmsg, $client, $fhem, $MAXLEN, $PORTNO);
$MAXLEN = 1024;
$PORTNO = 5555;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => 'udp')
    or die "socket: $@";
print "Awaiting UDP messages on port $PORTNO\n";
while ($sock->recv($newmsg, $MAXLEN)) {
     if (($newmsg) =~ /^.*hostapd:.*STA ([0-9a-f:]{17}).* associated/ ) {
         $client = $1;
        print "$client pressed\n";
                 my $fhem = IO::Socket::INET->new(PeerAddr => "localhost:7072");
                die "Can't connect to fhem\n" if(!$fhem);
                syswrite($fhem, "setreading dash $client pressed\n");
                shutdown($fhem, 1);
        }
        print $newmsg."\n";
}
die "recv: $!";


Ab wird unter dem Device Dash jeder Button anhand seiner Mac-Adresse als eigenes Reading geführt.
Sobald der Button sich im Wlan anmeldet (ab associated) wird ein setreading auf das Dummy gesetzt und der Zeitstempel aktualisiert.

Also das Perl Script läuft jetzt: Awaiting UDP messages on port 5555
Auf Open WRT startet /sbin/logread -e ".* associated .*" -f -u -r 192.168.1.22 5555 -p /var/run/logread.1.pid   in der /etc/rc.local
Der dummy dash ist auch angelegt. Jedoch kommen keine Readings.  Oder muß ich jeden Dash Button anhand der Mac Adresse noch separat anlegen?
Ach so, in open wert meldet sich der dash natürlich an...

Gruß Carsten
Raspberry Pi4
CUL 868, CUL 433, LaCrosse Gateway, Zigbeetomqtt2, HUE, Homematic
Max-Cube umgeflasht
MAX!, FhemtoFhem, Homebridge, FhemConnector, IR_Gateway und sonst auch noch allerlei Spielzeug....

justme1968

leuchtet der button eigentlich rot oder grün wenn man ihm das internet verbietet?

hat schon jemand versucht ihn auf per dns auf einen anderen server umzuleiten?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

CarstenF

Also nachdem er sich auf dem geblockten Open WRT Router angemeldet hat, leuchtet er erst im Blinkemodus weiß und da es nicht weitergeht, plötzlich rot für 1-2 Sekunden. Dann geht die Led aus.


Gesendet von iPad mit Tapatalk
Raspberry Pi4
CUL 868, CUL 433, LaCrosse Gateway, Zigbeetomqtt2, HUE, Homematic
Max-Cube umgeflasht
MAX!, FhemtoFhem, Homebridge, FhemConnector, IR_Gateway und sonst auch noch allerlei Spielzeug....

gloob

#72
Zitat von: justme1968 am 06 September 2016, 16:42:29
anbei mal eine erste version eines moduls das die oben beschriebene dhcp variante verwendet. es sind keine perl zusatz module nötig.

- define anlegen mit: define dash dhcp_dash
- wenn fhem nicht als root läuft: die oben vorgeschlagene  iptables regel verwenden und das port attribut passend setzen
- in allowed die liste der erlaubten mac adressen setzen
- das modul legt für jeden erlaubten button ein reading mit der mac adresse an und dem inhalt short wenn die adresse erkannt wird.

gruss
  andre

ps: völlig ungetestet. mein dash button ist immer noch eingepackt :)

Woran erkenne ich eigentlich, dass das Modul läuft. Habe es jetzt eingerichtet und sehe nichts.

Internals:
   CFGFN
   NAME       dashDetection
   NR         569
   NTFY_ORDER 50-dashDetection
   STATE      ???
   TYPE       dash_dhcp
Attributes:
   allowed    aabbccddeeff
   room       Amazon Dash


Edit:

Ein Problem habe ich schon gefunden:

dashDetection: failed to connect to  IO::Socket::INET: Permission denied

Wie könnte ich das lösen? FHEM läuft auf einem Raspberry Pi 3
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

justme1968

wenn alles gut geht ist state und STATE listening. wenn nicht solltest du einen fehler im log sehen.

wenn dein fhem nicht als root läuft musst du wie oben beschrieben den Port 67 auf einen anderen umbiegen und diesen im port attribut setzen.

in allowed muss die mac adresse mit : angegeben sein.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

gloob

Folgende Änderungen habe ich gemacht:

sudo iptables -A PREROUTING -t nat -i eth0 -p udp --dport 67 -j REDIRECT --to-port 6767

Jetzt sieht das List so aus:

Internals:
   CFGFN
   CONNECTS   1
   FD         33
   LAST_CONNECT 2016-09-06 17:39:04
   NAME       dashDetection
   NR         569
   NTFY_ORDER 50-dashDetection
   STATE      listening
   TYPE       dash_dhcp
   Readings:
     2016-09-06 17:39:04   state           listening
Attributes:
   allowed    ac:63:be:af:d6:xx
   port       6767
   room       Amazon Dash


Der Button meldet sich auch kurzzeitig am Router an und bekommt auch eine IP Adresse.
Trotzdem ändert sich nix in FHEM
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway