Amazon Dash Button

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

Vorheriges Thema - Nächstes Thema

peterk_de

#45
Der Reiz in den Dingern liegt m.E in der Kombination aus Preis und möglichst einfacher Hackbarkeit. Da hinkt die entwicklungsintensive ESP-Lösung dann doch etwas arg!?

Die einfachste stabile Lösung im Vorhandenen WLAN scheint momentan das npm-paket dash-button für node.js zu sein:

https://github.com/hortinstein/node-dash-button

Das läuft bei mir seit heute morgen zuverlässig ohne falsch-positive meldungen und je nach wlan-empfang des buttons mit 4 bis 10 sekunden delay.

Probleme sind momentan noch ne relativ hohe Totzeit nach einer Betätigung (da lässt sich ohne FW-Update wohl auch wenig dran machen da der button ca 20s aktiv ist bevor er wieder schläft) sowie ein mieser WLAN-Empfang von den Buttons. Liegt aber daran das 2,4Ghz hier einfach dicht ist. Aber so im Umkreis von 3m um den AP herum geht es ... ;(

Und das Delay könnte man sicher auch noch drücken mit ner Version speziell für die neuen Teile. Idealerweise natürlich als FHEM-Modul, aber da bin ich leider zeitlich raus ;)
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 ...

betateilchen

Zitat von: Blackmore am 02 September 2016, 21:17:47
Vielleicht nicht die beste Ausführung der Idee, aber vielleicht kann jemand was draus machen, das a) der Button vom Internet getrennt ist, und b) das Signal 'einfach' in FHEM reinkommt...

den Punkt a) kann ich doch auch einfach dadurch lösen, dass mein DHCP Server dem Button anhand seiner MAC Adresse eine entsprechende Konfiguration zuweist, die den Zugang ins Internet verhindert, beispielsweise über die DHCP Option 3 (Router).
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rx

Ich trigger bei mir auf den DHCP-Request und habe nach der Betätigung keine 20 Sekunden "Erholungszeit". Es leuchtet dreimal die rote Lampe auf und danach kann man wieder drücken.
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

peterk_de

#48
Auch interessant - es gibt offenbar auch eine offiziell "beliebig" nutzbare Version:

https://aws.amazon.com/de/iot/button/

... allerdings läuft dann natürlich alles über die Amazon Cloud.

Kosten: $19.99 ... aber die Api-Doku dort ist lesenswert. Das Ding kann auch noch lang- und doppelklick. Und sie raten von der Verwendung in stark WLAN- frequentierten Umgebungen ab - ob da meine über 40 empfangenen Netze zu zählen? ;-)

Ebenfalls spannend: Könnte man den vermutlich sicher verschlüsselten Request abgreifen, würde man noch an die Batteriespannung kommen. Und in der API steht auch offiziell wie man ihn im AP-Modus ohne Handy konfiguriert.

Also wird Amazon ungeblockt vermutlich sogar Batteriewarnungen versenden können, da die gesendeten Daten der gebrandeten Buttons sicher gleich sind...
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 ...

Blackmore

Also:

Bei meinen gebrandeten Tastern komm ich nur auf eine Infoseite mit Angaben von

MAC-Adresse
Seriennummer
Firmware
Batterielevel in %

Dabei ist es egal, ob der Taster schon konfiguriert wurde, oder nicht...

Eine Konfigurationsmöglichkeit habe ich adhoc nicht gefunden...

betateilchen

Zitat von: peterk_de am 03 September 2016, 08:44:39
Auch interessant - es gibt offenbar auch eine offiziell "beliebig" nutzbare Version:

Aber nicht für Deutschland - siehe Anhang

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gloob

Hat vielleicht jemand einen Tipp für mich wie ich das OpenWrt einzurichten habe? Aktuell würde ich es als WLAN-Bridge über LAN an den Router hängen. Und dann so die Buttons einrichten.
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

malted

#52
Zitat von: gloob am 03 September 2016, 13:43:37
Hat vielleicht jemand einen Tipp für mich wie ich das OpenWrt einzurichten habe? Aktuell würde ich es als WLAN-Bridge über LAN an den Router hängen. Und dann so die Buttons einrichten.

Normalerweise haben Openwrt ein LAN-Interface (br0 mit eth0 und wlan0).
Dann gibt es i.d.R. noch ein WAN-Interface. (oft eth1)

Solltest du keine zwei Ethernet-Ports haben, musst du LAN nur über wlan0 und WAN über eth0 konfigurieren

LAN wird das iot-Netz.
WAN ist unser "normales" Netz.

Ich gehe davon aus, dass du Luci hast.

1. System -> Administration -> dropbear auf unspecified (all interfaces)
2. Network -> Interfaces -> wan als dhcp konfigurieren
3. bei der firewall bei wan Input von reject auf accept einstellen (wir wollen von wan aus den router konfigurieren)
4. wlan ssid setzen (z.b. iotgw) und channel auf einen, der möglichst frei ist.
5. wpa2 verschluesselung mit phrase aktivieren
6. ein anderes subnetz für das wlan-setzen (192.168.25.*) damit es zu keinen Problemen kommt
7. System -> System -> Hostnamen auf iotgw
8. System -> System -> Logging  -> Dort als External system log server die IP von fhem eintragen, als Port z.B. 5555 nehmen. (Damit geht das komplette log an FHEM, das ist aber nicht viel Text/Traffic und  man kann es auf dem FHEM-Rechner filtern)

Wenn man am Ende den Dash eingerichtet hat, kann man bei der Firewall einfach das Masquerading ausschalten oder Forwarding deaktivieren. Dann kommen die Geräte im iot-lan nicht mehr heraus.

Wenn du Fragen hast, nur zu.

Ich habe derzeit nur einen Button. Ich prüfe jetzt auf die Mac-Adresse von meinem Dash. Damit kann man leicht unterschiedliche Dummy-Devices in FHEM benutzen. Nachdem ich ein älteres openwrt genommen habe, taucht das hostap associate nicht im Logfile auf. Deswegen hab ich unten die REGEXP angepasst.


#!/usr/bin/perl -w
#
use strict;
use IO::Socket;
my($sock, $newmsg, $clientmac, $fhem);
$sock = IO::Socket::INET->new(LocalPort => 5555, Proto => 'udp') or die "socket: $@";
print "Awaiting UDP messages on port 5555\n";
while ($sock->recv($newmsg, 1024)) {
     if (($newmsg) =~ /^.*DHCPACK.*([0-9a-f:]{17}).*/ ) {
        print "$1 signed in iot-net\n";
if ($1 eq "ac:63:be:aa:bb:cc") {
                $fhem = IO::Socket::INET->new(PeerAddr => "localhost:7072") or die "Can't connect to fhem\n";
                syswrite($fhem, "setreading dash button pressed\n");
                shutdown($fhem, 1);

      }
#        print "DEBUG: ".$newmsg."\n";
}
die "recv: $!";


Wenn man nicht das gesamte Internet auf der iot Seite sperren will, kann man einfach unter Network -> Firewall -> Custom Rules
eine MAC-Adresse aussperren.

config rule
        option src              lan
        option dest             wan
        option src_mac          ac:63:be:aa:bb:cc
        option target           REJECT


Ich habe es jetzt rund 24h am Laufen. Bislang keine false positives. Funktioniert hier ohne Probleme.

CarstenF

#53
Hallo malted, Erst mal vorab: Super Anleitung. Ich hatte auch noch nen alten TP-Link rumliegen und habe nun unter Open WRT den Dash Button eingerichtet. Den Code den Du oben geschrieben hast. Wo genau füge ich den ein? Einfach in die Eingabezeile in "FHEM"? Oder muß man den Code in der 99myutils.pm einfügen (nach MacAdressänderung). Als ich das gemacht habe, bekomme ich in FHEM diese Fehlermeldung

Unrecognized character \xC2; marked by <-- HERE after <-- HERE near column 1 at ./FHEM/99_myUtils.pm line 28

Gruß Carsten

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....

Rince

Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

malted

Zitat von: CarstenF am 05 September 2016, 17:47:18
Den Code den Du oben geschrieben hast. Wo genau füge ich den ein? Einfach in die Eingabezeile in "FHEM"? Oder muß man den Code in der 99myutils.pm einfügen (nach MacAdressänderung).

Das ist ein standalone-perl script. Einfach in eine Datei tun. (z.b. proxy.pl) und dann
auf der Shell starten. (entweder mit chmod +x proxy.pl;./proxy.pl oder mit perl proxy.pl).

Vielleicht kann einen Tipp liefern, wie man einen non-blocking udp-server unter my_utils.pm bauen könnte...

CarstenF

Ok, Danke

hatte das script gestern in 99myUtils.pm verpackt und Fhem zum anhalten gebracht. Warum auch immer....
Werde es im Laufe des Tage mal ausprobieren.

C.
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....

Wzut

#57
Hier ein Vorschlag als fhem Modul ohne Pyhton, Javasript oder OpenWRT (nur Perl).
Getestet auf meinem Ubuntu Server und einem Raspberry. Zuerst müssen zwei zusätzliche Pakete installiert werden :
sudo apt-get install libnet-pcap-perl
sudo apt-get install libnetpacket-perl 

Wenn fhem mit Userrechten läuft (also nicht aks root), hat dieser User normalerweise keine Rechte für direkten Zugriff auf die Netzwerkkarte.
Die Lösung fand ich in einem Artikel über Wireshark. In diesem Fall noch das folgende Paket installieren :
sudo apt-get install libcap2-bin
und auf der Konsole noch :
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/perl
Nun kann das Modul eingebunden werden :
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 mac b47443267fb9,deadbeef0001


Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

justme1968

#58
ich bin immer noch nicht dazu gekommen meinen dash button auszupacken, aber wäre es nicht einfacher auf das dhcp discover zu lauschen statt auf arp? die verzögerung sollte immer noch ok sein.

das ginge auch als nicht root und ohne ungewöhnliche pakete nach zu installieren. BlockingCall wäre auch nicht nötig.

gruss
  andre

edit: dhcp ist port 67. d.h. ohne root geht es doch nicht :(
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

peterk_de

#59
Ich weiß jetzt gar nicht, wie es die node-dash-button Bibliothek macht, also ob arp oder dhcp, aber die geht hervorragend bei mir:

1. Ggf. Node.js installieren, bei Debian und co beachten, dass das per apt-get gelieferte node.js meist zu alt ist!

2. Request-Package https://www.npmjs.com/package/request installieren (sudo npm install request)

3. https://github.com/hortinstein/node-dash-button gemäß Anleitung dort installieren

4. In FHEM einen Dummy anlegen (hier: define system.dashbuttons DUMMY) und attr system.dashbuttons event-on-update-reading .* setzen.

5. Im folgenden Script FHEM-Pfad, die Mac-IDs und Namen der Buttons sowie den FHEM-Dummy-Namen anpassen und auf der Linux-Shell starten (und ggf. Autostart einrichten):

Aufruf:
node dashbutton.js

Skript (als dashbutton.js speichern):

var dash_button = require('node-dash-button');
var request = require("request");


var buttons = {
"50:f5:da:xx:xx:xx":"Pedigree",
"ac:63:be:xx:xx:xx":"Schwarzkopf",
"ac:63:be:xx:xx:xx":"Ariel"
}

var button;
var macids = [];
for (button in buttons) {
macids.push(button);
}

var dash = dash_button(macids);

dash.on("detected", function (dash_id){
    console.log("found dash - mac="+dash_id+" name="+buttons[dash_id]+"!");
    request("http://192.168.xx.xx:8083/fhem?cmd=setreading%20system.dashbuttons%20"+buttons[dash_id]+"%20pressed", function(error, response, body) {
       console.log("fhem request done!");
    });

});



Danach erhält nach Tastendruck der DUMMY für jeden definierten Button ein neues Reading und es wird ein entsprechendes Event geworfen. (Der im Script definierte Button-Name wird als Readingname verwendet).

Hab es jetzt in mein Produktivsystem für 3 Buttons übernommen, da es stabil funktioniert. Delay ca. 4 Sekunden. Reicht für diverse Sachen, wie z.B. Lichtszenenwahl oder Heizmodi. Kritischster Punkt ist bei mir der WLAN-Empfang von den Teilen, das klappt manchmal, in vom nächsten AP weiter entfernten Räumen, nur bei cm-genauer Positionierung. Dann aber komischerweise zuverlässig. Wenn er kein WLAN findet, blinkt er ca. 10 Sekunden weiß, und nicht weiß und dann gleich rot, man hat also auch eine Art Feedback, ob es geklappt hat ^^

Edit: huch, gar nicht gesehen dass schon ein Modul gepostet wurde, das ist natürlich noch feiner!! Danke, Wzut, ich teste!
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 ...