ESP - Lan und PoE

Begonnen von der-Lolo, 20 Juni 2018, 10:26:56

Vorheriges Thema - Nächstes Thema

der-Lolo

Hallo Comunity,
für mein Projekt "Zugangskontrolle" würde ich gerne ESPs einsetzen, bedingung wäre eine LAN verbindung und am liebsten die möglichkeit die geräte dann auch per PoE zu versorgen.
Bisher war all mein Googeln erfolglos - lediglich ein projekt habe ich gefunden, hier gibts aber noch keine fertigen Bauteile.

Habt Ihr vielleicht erfahrung und oder Geräte kombinationen die ohne große Lötorgien funktionieren?


JoWiemann

Hallo, würdest Du Deine Anforderungen bitte spezifizieren. Wie stellst Du Dir eine Zugangskontrolle vor, oder meinst Du eher Anwesenheit? Ist Zugangskontrolle auch Zugangsberechtigung? Und wenn Berechtigung, was soll berechtigt werden?


Gesendet von iPad mit Tapatalk
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM


der-Lolo

Wow, vielen Dank... Ich glaube jetzt werde ich fündig - ich vermute etwas was nicht zusätzlich einen passiven Adapter braucht gibt es nicht.

Eigentlich wollte ich das ganze mit einem Arduino und einem PoE Shield erschlagen, aber das PoE Shield arbeitet nicht wie erwartet - versorgt den Arduino nicht mit Spannung.
Geplant sind 1-Wire iButton Reader welche dann sowohl als Zugang (Garage & Gartentor) als auch die Anwesenheit schalten sollen. An der Haustüre wird es auch einen Reader zum scharf/unscharf schalten der Alarmanlage geben. 
FHEM soll die verwaltung der gültigen Seriennummern übernehmen und registrieren wer welche Tür wann benutzte.

sbiermann

Ich würde damit keine Alarmanlage schalten oder gar Türen die ins innere des Hauses führen öffnen, dazu sind die iButtons viel zu unsicher.

Frank_Huber

Zitat von: sbiermann am 20 Juni 2018, 12:07:02
Ich würde damit keine Alarmanlage schalten oder gar Türen die ins innere des Hauses führen öffnen, dazu sind die iButtons viel zu unsicher.
Sehe ich auch so.
Alles was die "Aussenhaut" durchdringt gehört in eine professionelle Lösung.

Wuppi68

Oder warte noch ein wenig bis der POE Shield für den neuen Raspi auf den Makrt kommt ...

Könnte aber ein wenig oversized sein 8-)
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

rabehd

ich habe einen ESP32 mit iButton-Reader der die ID an FHEM übermittelt. Bei berechtigten IDs wird die "Alarmanlage" unscharf geschaltet. Türen öffne ich damit nicht und der Reader ist hinter der ersten Tür.

Aber
Zitatdazu sind die iButtons viel zu unsicher.
ist mir zu wenig Info. Auf Anhieb habe ich da auch nichts gefunden.
Wir reden hier auch von einem Haus/Wohnung und nicht von einem Geldspeicher. Sicher ist nie eine Lösung.
Auch funktionierende Lösungen kann man hinterfragen.

der-Lolo

So sehe ich das auch, vielleicht wird der Reader auch im Haus angebracht und ein Haustüralarm um genügend sekunden verzögert um unscharf schalten zu können. Ein Schloss möchte ich auch nicht öffnen - ausser eben an der Garage oder dem Gartentor. Bevor sich jemand die arbeit macht den Reader zu überlisten ist er auch über den Zaun geklettert.
@rabehd: Dein Sketch und die art der Datenübermittlung zu FHEM würde mich interessieren.

sbiermann

Es gibt einen Talk auf dem 27c3 wo auf die Sicherheitsprobleme mit iButtons aufmerksam gemacht wurden und das war schon im Jahr 2010. Sehr interessant der Talk.
Den Talk gibt es hier als Video: https://www.youtube.com/watch?v=MxhUR7HPfRU

rabehd

Hier eine kurze Beschreibung:
https://forum.fhem.de/index.php/topic,67427.msg778072.html#msg778072
Das Problem mit dem Nichtschlafen habe ich gefunden. Ursache war die fritzbox, die bei Abwesenheit das Gäste-WLAN auschalten sollte. Seitdem ich das nicht mehr tue ist alles ok.
Die Powerbank ist durch einen Akku ersetzt.
Mittlerweile sind noch 3 LED (3Farb) hinzugekommen für Fenster auf, Licht an und Alarmanlage.
Nächster Schritt ist das Messen der Spannung des Akkus und Übermittlung zu MQTT.
Dann will ich den Touchsensor noch ergänzen mit Homematic 8-Kanal-Empfangsmodul gepeert mit dem Haustürsensor, so dass ich beim Kommen nicht mehr den ESP wecken muss.
Gehäuse fehlt auch noch.
#include <OneWire.h>
#include <WiFi.h>
#include <PubSubClient.h> // MQTT Bibliothek

RTC_DATA_ATTR int bootCount = 0;

//OneWire  D-Nummer funktionert
OneWire  dein(16);
OneWire  daus(4);

// LED
uint8_t ledAR = A5;
uint8_t ledAG = A4;
uint8_t ledFG = A18;
uint8_t ledFR = A19;
uint8_t ledLG = A17;
uint8_t ledLR = A16;


// WLAN-Daten
const char* ssid = "meinWLAN";
const char* password = "denkste";
// MQTT-Server
const char* mqtt_server = "192.168.x.x";
// globale Variable
int threshold = 40;
int dauer = 0;
int beginn= 180;
int zeit = beginn;
long lastMsg = 0;
char Key[50];
int value = 0;
int bridhtg = 25;
int bridhtr = 250;


WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  // Solange wiederholen bis Verbindung mit MQTT wiederhergestellt ist
  while (!client.connected()) {
    Serial.println("Versuch des MQTT Verbindungsaufbaus...");
    // Create a random client ID
    String clientId = "Wormser34-Key";
   // clientId += String(random(0xffff), HEX);
    Serial.println(clientId);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("MQTT connected");
      // Once connected, publish an announcement...
       // Nun versendet der Arduino eine Nachricht in
       client.publish("fhem/ibutton", "iButton Reader connected");
      // ... and resubscribe
      // und meldet sich beim Topic für eingehende Nachrichten an:
      client.subscribe("fhem/ibutton/status");
      client.subscribe("fhem/Zustand/Fensterhinten");
      client.subscribe("fhem/Zustand/allesLicht");
      client.subscribe("fhem/Zustand/AlarmAktiv");
      client.subscribe("fhem/Zustand/AlarmStatus");
    }
    else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" Nächster Versuch in 5 Sekunden");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

// reagiert, wenn bei MQTT im abonnierten Topic eine neue Nachricht eintrifft
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  Serial.println(length);
  Serial.println((char*)payload);
  // Wenn Topic ibutton, dann
  if (!strcmp(topic,"fhem/ibutton/status")){
    if ((char)payload[0] == 'o') {
      Serial.println("rot aus");
      digitalWrite(19, LOW ); 
      digitalWrite(5, LOW ); 
    }
    else if ((char)payload[0] == 'n') {
      Serial.println("grün aus");
      digitalWrite(18, LOW ); 
      digitalWrite(17, LOW ); 
    }
  }
  else if (!strcmp(topic,"fhem/Zustand/Fensterhinten")){
   Serial.println("Fenster");
    if ((char)payload[0] == 'o') {Serial.println("Fenster offen");ledcWrite(3, bridhtr);ledcWrite(4, 0); }
    else if ((char)payload[0] == 'z'){Serial.println("Fenster zu");ledcWrite(4, bridhtg);ledcWrite(3, 0);}
  }
  else if (!strcmp(topic,"fhem/Zustand/allesLicht")){
  Serial.println("Licht");
    if ((char)payload[0] == 'o') {Serial.println("Licht ein");ledcWrite(5, bridhtr);ledcWrite(6, 0); }
    else if ((char)payload[0] == 'a'){Serial.println("Licht aus");ledcWrite(6, bridhtg);ledcWrite(5, 0);  }
   }
else if (!strcmp(topic,"fhem/Zustand/AlarmAktiv")){
  Serial.println("Alarmanlage");
    if ((char)payload[0] != 'a') {Serial.println("Alarmanlage ein");ledcWrite(1, bridhtr);ledcWrite(2, 0); }
    else if ((char)payload[0] == 'a'){Serial.println("Alarmanlage aus");ledcWrite(2, bridhtg);ledcWrite(1, 0); }
   }
  else if (!strcmp(topic,"fhem/Zustand/AlarmStatus")){
  Serial.println("Alarmstatus");
    if ((char)payload[0] != 'd') {Serial.println("Alarmanlage ausgelöst");digitalWrite(22, HIGH ); }
    else if ((char)payload[0] == 'd'){Serial.println("Alarmanlage wartet");digitalWrite(22, LOW ); }
   }
  else {Serial.println("nichts");}

}

void gotTouch(){ }


void setup(){

  delay(100); //Take some time to open up the Serial Monitor
  Serial.begin(115200);
  Serial.println("iButton Reader");

  //Increment boot number and print it every reboot
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));

// initialize digital pin as LED output
  pinMode(18, OUTPUT);  // grün ein
  pinMode(19, OUTPUT); // rot ein
  pinMode(17, OUTPUT); // grün aus
  pinMode(5, OUTPUT);  // rot aus
  pinMode(22, OUTPUT);  // blau Alarm ausgelöst
  ledcAttachPin(ledAR, 1);
  ledcAttachPin(ledAG, 2);
  ledcAttachPin(ledFR, 3);
  ledcAttachPin(ledFG, 4);
  ledcAttachPin(ledLR, 5);
  ledcAttachPin(ledLG, 6);

  // Initialize channels
  // channels 0-15, resolution 1-16 bits, freq limits depend on resolution
  // ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
  ledcSetup(1, 12000, 8);
  ledcSetup(2, 12000, 8);
  ledcSetup(3, 12000, 8);
  ledcSetup(4, 12000, 8);
  ledcSetup(5, 12000, 8);
  ledcSetup(6, 12000, 8);

  //Setup interrupt on Touch Pad
  touchAttachInterrupt(T4, gotTouch, threshold);
  touchAttachInterrupt(T5, gotTouch, threshold);

  //Configure Touchpad as wakeup source
  esp_sleep_enable_touchpad_wakeup();
 
  setup_wifi();
 
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);   
}

void loop(){
 
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  byte STELLE[8];

if (dauer > 0) {
    dauer--;}
  else { 
    // LED aus, wenn Zeit abgelaufen
    digitalWrite( 18, HIGH ); 
    digitalWrite(19, LOW ); 
    digitalWrite( 5, HIGH ); 
    digitalWrite(17, LOW );
   }
 
  if (zeit < 1 ) { 
    Serial.println("gehe Schlafen"); 
    esp_deep_sleep_start();
  }
  else { zeit--;}


  //Verbindung zum iButton prüfen und ggf. wiederherstellen
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
 
  byte result;

  // Suche nach ibutton
  // Value bestimmt welcher Reader
  if (dein.search(addr)) {
    Serial.println("button ein");
  // Reader Zugang
    value = 1;
    zeit = beginn;
   }
  else {
    if (daus.search(addr)) {
       Serial.println("button aus");
      // Reader Abgang
      value= 2;
      zeit = beginn;
    }
    else{
      value=0;
      delay(250);
      return;
    }
  }

  // LED auf Orange, wenn ein iButton eingelesen
  if (value > 0) {
      //Orange an
    digitalWrite(19, HIGH ); 
    digitalWrite(18, HIGH );
    digitalWrite(17, HIGH ); 
    digitalWrite(5, HIGH );
    dauer=20;
  }

  // gelesenen Chip auf Serial-Monitor ausgeben
  for( i = 0; i < 8; i++) {
     if (addr[i] <= 0xF){Serial.print("0");}
    Serial.print(addr[i], HEX);
  }
  Serial.println();
  // den gelesenen Chip an MQTT übergeben
  sprintf (Key, "%02x%02x%02x%02x%02x%02x%02x%02x",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
  // Bei value == 1; ID als Kommend übergeben
  if (value == 1)  {client.publish("fhem/ibutton/ein", Key);}
  // Bei value == 2; ID als Gehend übergeben
  if (value == 2)  {client.publish("fhem/ibutton/aus", Key);}
  client.publish("fhem/ibutton/status","--");
}

Historisch gewachsen, Code teilweise aus Internetbeispielen...geht sicher noch besser und schöner
Auch funktionierende Lösungen kann man hinterfragen.

rabehd

@sbiermann
Ich habe mir noch nicht die Stunde für das Video Zeit genommen.

Ein Angreifer braucht eine meiner ID's, die in FHEM hinterlegt sind. Kann er die simulieren?
Das ist für mich die reale Gefahr. Aber keine große. Vorher hat er ein Fenster eingeworfen, den Server gefunden, die Sirene zerstört...
Auch funktionierende Lösungen kann man hinterfragen.

sbiermann

Ich habs noch nicht komplett geschaut, nur mal in einen Beitrag zu dem Thema gelesen, dass diese Serien Ids anscheinend Linear vom Anbieter hoch gezählt werden. Sprich das wenn du 2 Buttons einer Serie kaufst es sein kann das die Seriennummern nur um 1 verschieden sind. Das würde das raten einer echten Seriennummer sehr trivial machen, weil man nicht mehr alle Kombinationen durch testen muss, sondern kann bei einer bestimmten Nummer anfangen und kommt dann recht fix zu einen gültigen Treffer. Das dürfte vermutlich in weniger als ein paar Minuten erledigt sein und macht auch keine Geräusche wie ein Stein durchs Fenster oder Sirene die dann los heult.

rabehd

Ich habe 4 Stück gekauft (verschiedene farbige Halterungen in einer Bestellung) -> alle unterschiedliche IDs.
Wer an den Reader will muss die Tür aufbrechen oder das Fenster einwerfen.
Alle Einbrüche in der Strasse gingen über die Terassen und nie würde das Klirren gehört. Dabei brauchten sie bei uns 4 Steine.
Eine Alarmanlage schützt nicht vor Einbrechern, es besteht nur die Hoffnung auf Vertreibung.
Das Türschloß würde ich nicht an irgendeine Technik hängen, Garage vielleicht. Schalter für Alarmanlage über iButton ist für mich ok. Besser als gar keine Anlage.
Auch funktionierende Lösungen kann man hinterfragen.