iButton als Zuganskontrolle per ESP8266 -> MQTT -> Fhem und zurück..

Begonnen von lenoxef, 19 Februar 2017, 16:25:51

Vorheriges Thema - Nächstes Thema

lenoxef

Hallo Fehm Gemeinde,

ich versuche nun schon seit längerem diverse iButtons --> https://de.wikipedia.org/wiki/IButton als Zutrittskontrolle zu verwenden. Genauer gesagt ich möchte damit meine Alarmanlage scharf/unscharf schalten. Da der Raspi nicht in der Nähe der Haustür ist, möchte ich das ganze gern auf einem ESP8266 (NodeMCU) laufen lassen. Dieser soll so wenig Intelligenz wie möglich besitzen. Am besten nur Einlesen und per WLAN -> MQTT die gelesenen Daten an FHEM senden. Die Auswertung, ob es sich beim gelesenen iButton um einen gültigen Key handelt, möchte ich gern in FHEM machen.

Was bisher getan wurde:

Das Einlesen der iButtons auf dem ESP8266 funktioniert und wird im SerialMonitor ausgegeben.

Über diesen Beitrag hier http://s6z.de/cms/index.php/homeautomation-homecontrol/hardwareplattformen/esp8266/113-mqtt-basic-esp8266-mqtt-example , habe ich den Broker in FHEM installiert und kann mir dem Beispielprogramm den String ,,Hello World #1 ..." zum Raspi senden. Weiter komme ich allerdings nicht.

Nächster Schritt sollte sein, dass ich in FHEM ein Reading habe welches mir den ,,Hello World"-String zeigt. Ich bräuchte da mal Hilfe bei der Definition in FHEM. Sobald das funktioniert, werde ich meine iButton Auswertung und das MQTT Beispiel kombinieren und versuchen die IDs auszuwerten.

Wenn das alles läuft, wäre die andere Richtung (FHEM steuert z.B. RGB LEDs oder ein Display am ESP8266) noch interessant.

Sollte jemand nähere Infos benötigen, einfach melden.

Vielen Dank schon mal an M. Pfannenstiel von dem der o.g. Beitrag geschrieben wurde.

Pf@nne

Moin leno,

wenn du mit deinem Button schon im ESP8266 bist, dann musst du ja die ButtonID "nur noch" als publish absetzen.....
Nimm mal dieses Template, da ist eigentlch schon alles drinn.

https://forum.fhem.de/index.php/topic,50238.0.html
https://github.com/Pfannex/ESP8266_Basic

Beim Umgang mit MQTT hilft der MQTT-Spy enorm...
https://github.com/eclipse/paho.mqtt-spy/wiki/Downloads

Schaue mal in das Template, damit solltest du realativ einfach ein Topic absetzen können.

Alternativ hänge deinen Code mit laufendem MQTT-Client mal als Anlage drann.

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

lenoxef

Hallo Pf@anne,

danke für deine Antwort. Ich bin fast soweit ;). Ein kleines Problem habe ich gerade bei der Formatierung des Output-Strings.

Wie bekomme ich das hier:

for( i = 8; i > 0; i--) { // kopiert die einzelnen Stellen auf Temp-Variablen
     if (i=8) {STELLE[1] = addr[7];}
     if (i=7) {STELLE[2] = addr[6];}
     if (i=6) {STELLE[3] = addr[5];}
     if (i=5) {STELLE[4] = addr[4];}
     if (i=4) {STELLE[5] = addr[3];}
     if (i=3) {STELLE[6] = addr[2];}
     if (i=2) {STELLE[7] = addr[1];}
     if (i=1) {STELLE[8] = addr[0];}

// Kontrolle der einzelnen Stellen auf "Zweistelligkeit" wenn Ein-Stellig dann füge führende Null hinzu...
  if (STELLE[1] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[1], HEX);                 // Segment ausgeben
  //Serial.print(":");                         // ":" zwischen den Segmenten einfügen
  if (STELLE[2] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[2], HEX);                 // Segment ausgeben
  //Serial.print(":");                         // ":" zwischen den Segmenten einfügen
  if (STELLE[3] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[3], HEX);                 // Segment ausgeben
  //Serial.print(":");                         // ":" zwischen den Segmenten einfügen
  if (STELLE[4] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[4], HEX);                 // Segment ausgeben
  // Serial.print(":");                        // ":" zwischen den Segmenten einfügen
  // Serial.setCursor(0,2);                    // ":" zwischen den Segmenten einfügen
  if (STELLE[5] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[5], HEX);                 // Segment ausgeben
  // Serial.print(":");                         // ":" zwischen den Segmenten einfügen
  if (STELLE[6] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[6], HEX);                 // Segment ausgeben
  // Serial.print(":");                         // ":" zwischen den Segmenten einfügen
  if (STELLE[7] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[7], HEX);                 // Segment ausgeben
  // Serial.print(":");                         // ":" zwischen den Segmenten einfügen
  if (STELLE[8] <= 0xF){Serial.print("0");}     // Fuehrende Null erzeugen
  Serial.print(STELLE[8], HEX);                 // Segment ausgeben
  Serial.print(" ");


in ein Format welches ich mit

client.publish("outTopic", msg);

ausgeben kann?

mfg
lenoxef

digiart

Hallo!

Ich bin bei einem ähnlichen Vorhaben, nur kommen bei mir die Daten von einer RFID-Karte.
Nach der Installation und Einrichtung des MQTT-Brokers legst du zuerst ein MQTT-Device an:define mqtt MQTT 127.0.0.1:1883
attr mqtt room MQTT


Dann habe ich eine MQTT_BRIDGE definiert:define mqtt_Kartenleser MQTT_BRIDGE Kartenleser
attr mqtt_Kartenleser IODev mqtt
attr mqtt_Kartenleser publishState fhem_sub/0/kartenleser
attr mqtt_Kartenleser room RFID
attr mqtt_Kartenleser stateFormat transmission-state
attr mqtt_Kartenleser subscribeSet fhem/0/kartenleser/set

wobei fhem/0/kartenleser/set
das Topic ist, über das des ESP sendet.
Danach habe ich noch einen Dummy definiertdefmod Kartenleser dummy
attr Kartenleser room RFID

In dessen state kommt automatisch das Payload aus der MQTT_BRIDGE rein.

Für die Rückmeldung habe ich HTTP oder auch MQTT vorgesehen, da arbeite ich noch daran. Ausserdem muss ich erst rausfinden, wie ich am komfortabelsten eine Liste mit den genehmigten Karten warten kann.
Anfragen ausserhalb der Threads (PN, Mail o.ä.) werden ignoriert!

lenoxef

Hallo digiart,

das ist erst der nächste Schritt, aber das hätte ich somit auch als nächstes gefragt.. Mein Problem liegt noch auf Arduino Seite. Im SerialMoniotor sieht alles gut aus, aber da wird der Strin Zeichen für zeichen hintereinander geschrieben. Aktuell erfolgt die Ausgabe mit:

for( i = 0; i < 8; i++) {
    if (addr[i] <= 0xF){Serial.print("0");}
    Serial.print(addr[i], HEX);
    }
Serial.println();


Ich suche jetzt nach einer Möglichkeit, die einzelnen "addr[0..7]" in einen String namens "msg" zu packen und dann mittels

client.publish("outTopic", msg);

zu senden.


digiart

Hi!

Hatte ein ähnliches "Problem" mit der MAC-Adresse, da ich den AccessPoint-Namen im Falle einer Nicht-Konfiguration des WiFi aus der MAC-Adresse generiere.
Dazu habe ich folgenden Code:

String print_hex(int val){
  char str[2];
  sprintf(str,"%02x",val);
  return str;
}

  MAC_Addr = "";
  WiFi.macAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    MAC_Addr += print_hex(MAC_array[i]);
    if (i < (sizeof(MAC_array)-1)) {
      MAC_Addr += ":";
    }
  }
  MAC_Addr.toUpperCase();

Anfragen ausserhalb der Threads (PN, Mail o.ä.) werden ignoriert!

lenoxef

 :) :) :) :)
Perfekt!!

sprintf(str,"%02x",val);

das hat mir gefeht!

So siehts jetzt aus..

  for( i = 0; i < 8; i++) {
    if (addr[i] <= 0xF){Serial.print("0");}
    Serial.print(addr[i], HEX);
    }
Serial.println();

sprintf (msg, "%02x%02x%02x%02x%02x%02x%02x%02x",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
client.publish("outTopic", msg);


und funktioniert. Jetzt gehts weiter zu Fhem. Also zu deiner vorherigen Antwort.. DANKE

lenoxef

Jetzt bräuchte ich pf@nnes auszug aus der cfg..

mittels

"mosquitto_sub -d -t outTopic" in putty bekomme ich

Client mosqsub/15209-raspberry received PUBLISH (d0, q0, r0, m0, 'outTopic', ... (16 bytes))
32a79fb601000013


angezeigt. Wie muss die definition in Fhem aussehen?

mit define MyBroker MQTT 192.168.8.55:1883
define mqtt_iButton MQTT_BRIDGE iButton
attr mqtt_iButton IODev MyBroker
attr mqtt_iButton publishState mosqsub/11839-raspberry
attr mqtt_iButton room iButton Reader
attr mqtt_iButton stateFormat transmission-state
attr mqtt_iButton subscribeSet mosqsub/11839-raspberry/outTopic

defmod iButton dummy
attr iButton room iButton Reader


gehts jedenfalls nicht.

Pf@nne

Zitat von: lenoxef am 20 Februar 2017, 20:44:08
angezeigt. Wie muss die definition in Fhem aussehen?

Nimm einen MQTT_DEVICE nicht eine MQTT_BRIDGE

define mqtt_iButton MQTT_DEVICE
attr mqtt_iButton IODev MQTT_Broker
attr mqtt_iButton stateFormat state
attr mqtt_iButton subscribeReading_ID outTopic


Das reading ID sollte jetzt durch das Topic "outTopic" gefüllt werden

EDIT:
attr mqtt_iButton stateFormat ID
zeigt die ID dann auch als state an
FHEM auf: DS415+ (Master), Raspberry Pi 2

lenoxef

was lange währt wird endlich gut...

Vielen Dank an alle Beteiligten. Es funktioniert.. Die weitere Verwendung in Fhem bekomme ich sicher allein hin. Wenn interesse an dem Arduino-Code besteht, häng ich ihn gern hier an.

mfg
lenoxef

der-Lolo

Hey lenoxef, Kannst du angaben zur Performance machen? Mich würde interessieren wie lange fhem brauchen würde um z.b. das Gartentor zu öffnen...

lenoxef

Hallo Lolo,

ich würde sagen die Reaktionszeit im Pfad iButton->ESP8266(NodeMCU)->WLAN->Lan->Raspi->Fhem ist gefühlt kleiner 1s. Wenn ich einen iButton an den "Reader" halte wird das sofort in FHEM angezeigt. Was du danach noch an Aktorik hast, kann ich natürlich nicht sagen.

Gruß
lenoxef

blade-of-fire

Hallo lenoxef,

da ich zur Zeit mit ConfigurableFirmata und Arduino Nano mit meinen iButtons per owx nicht wirklich glücklich bin (https://forum.fhem.de/index.php/topic,59630.15.html), klingt das hier nach einer alternative, die iButtons abzufragen.
Du hattest ja schon angeboten, den Sketch zu posten. Ich würde das Angebot gerne annehmen.
Bin bei der Arduino-Programmierung noch sehr neu, will mich da aber mehr einarbeiten.

Danke schonmal.
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

Spielmann

Hallo zusammen,
blade-of-fire spricht mir aus der Seele. Ich steuere seit einem Jahr mit der ConfigurableFirmata und Arduino Mega unsere Hoftankstelle (20 x iButtons). Ich weiß nicht, wie oft ich schon neu durchgestartet habe, da die Verbindung zum Arduino mal wieder streikt. Auf der Suche nach etwas Stabileren bin ich mit Interesse auf diesen Thread gestoßen.
Ich wäre auch an dem Sketch interessiert. Evtl. könnte ich noch zur Code- KM-Stand-Eingabe einen Tastenblock und LED Anzeige per I2C einbinden (http://www.esp8266-projects.com/2016/02/mailbag-4x4-matrix-keyboard-for-esp8266.html). Mal schauen wie ich mich in die Arduino Programmierung einarbeiten kann.

Gruß
Spielmann
FHEM mit Raspi (Zentrale)
Raspberrymatic (Heizung)
Siemens LOGO8 (Lichtsteuerung)
Philips HUE Gedöns
Diesel-Tankstelle mit fhem und ESP (eine ewige Baustelle)

lenoxef

Kein Problem, ich hänge den Sketch heute Abend hier an. Erwartet aber nichts all zu Spektakuläres.

Der Betreff dieses Beitrags lautet ja "[...] Fhem und zurück.." Ein Display, Buttons und ggf RGB-LEDs sind meienrseits auch geplant. Vieleicht ist ja einer von euch schneller oder hat schon was passendes was man mit meinem Sketch kombinieren kann.

Gruß
lenoxef