--> -->

Smarthome und Hilfe

Da ich mich mal mit dem Thema "Smarthome" befassen wollte, habe ich mir mal das Projekt angesehen.

Vom Prinzip her ist das recht einfach Aufgebaut, aber nur im Prinzip.

Was mir schon beim ersten Mal der Installation auf gefallen ist, einige Tipps des Programmierers gehen nicht und die Bilder sind auch auf einer Internet Adresse, wo der Server nicht mehr Existiert. Nett.

Anfürsich sind die Hilfen und Anleitungen recht Ordentlich geschrieben und auch gut Verständlich. Wenn man was nicht versteht, dann benutzt die guten Videos dazu, die klären dann meistens die restlichen Fragen.

Unter dem Punkt Anleitungen/Geräte vorbereiten/Funksender(Arduino)/Funksignal von bestehenden 433Mhz Geräten über Haussteuerung senden kann man unbekannte Funksteckdosen auslesen, aber nur wenn man den Sender noch dazu hat. Sonst geht das nicht, also, nur die Steckdose einfach auslesen. Wie auch, sie ist ja nur ein Empfänger und kein Sender. Benutzt einfachhalber nur Steckdosen mit DIP Schalter. Alles andere ist zu Umständlich, bzw. geht gar nicht. Ich hatte das die Tage mit der Firma UNITEC probiert und ich bekam keine vernüftige Verbindung zu stande, da diese Anlage 4 verschiedene Codes sendet und man im Grunde in dem Programm was ändern müsste, wozu ist definitiv keine Lust habe.

Was ich aber geändert habe, war der Sketch, den der gefiel mir gar nicht. Hier nun mein Sketch dazu. Alles kann man mit dem Programm ARDUINO IDE bearbeiten und Compilieren.

/*
  Simple example for receiving
 
  http://code.google.com/p/rc-switch/
 
  Need help? http://forum.ardumote.com
*/

#include

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(57600);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
  mySwitch.setPulseLength(250);
  Serial.println("                    433 Mhz Fernsteuerungscode Empfaenger V1");
  Serial.println("Warte auf Code.");
}

void loop() {
  if (mySwitch.available()) {
   
    int value = mySwitch.getReceivedValue();
   
    if (value == 0) {
      Serial.println("Unbekannter Code:");
    } else {
      Serial.println("A-------");
      Serial.print("Empfange ");
      Serial.println( mySwitch.getReceivedValue() );
      Serial.print("Bitlaenge: ");
      Serial.println( mySwitch.getReceivedBitlength() );
      Serial.print("Protokoll: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      Serial.print("Tri-Stat: ");
      Serial.println( mySwitch.getReceivedDelay() );
      Serial.println("E--------");
    }

    mySwitch.resetAvailable();
  }
}
 

 

Code-Anhang zum Downloaden

 

Ich finde die Anzeige etwas Aussagekräftiger.

Ausserdem waren in Orginal Sketch 2 x #include drin, die man erst mal Löschen sollte, da es nicht Kompiliert wird.

Dann fand man in der Anleitung was mit SIGNALEN, was leider NICHT vorhanden war. OK, kein Thema, wenn man sich mit Datenbanken auskennt.Ich gehe jetzt nicht auf das Thema phpMyAdmin ein, das sollte man im Netz finden, aber das Programm wird dafür gebraucht um diesen Fehlenden Punkt "SIGNALE" wieder zu erzeugen.

Den Datenbank Eintrag "menu" suchen und dort irgendeinen Datensatz auf "kopieren" drücken. Was da jetzt drin steht ist Unwichtig, da wir das jetzt gleich ändern.

id = 140

text = Signale

parent = Einstellungen

link = ?menuParent=Einstellungen&run=alarmgeberConfig

status = admin

target = _top

tooltip = Hier koennen die Alarmgeber (Sirenen und so weiter ) konfiguriert werden.

sortnr = 110

name = Hauptmenue

der Rest egal und OK drücken.

Somit kann man unter Einstellungen jetzt auch den Punkt SIGNALE finden. Der ist für die ALARMANLAGE zuständig, damit man zb. eine Sirene ansteuern kann. Später mehr dazu.

Wenn ihr euch die Datenbank anschaut, dann sind auch einige Einträge vorhanden, die mal zu einer alten MAILBOX oder Forum gehört hat. Ist natürlich teilweise Müll. aber dazu habe ich auch keine Lust, das mal zu bereinigen..  Stört aber auch nicht wirklich.

Bitte achtet darauf, das ihr KEINE UMLAUTE in der Datenbank verwendet. Das kapiert die Datenbank nicht, dann schreibt das lieber um in AE oder UE usw.

Nun kam bei mir noch der Aspekt, meine Lampen werden mit einem Eltako geschaltet und somit gehen diese Module zum Schalten der Lampen beim Smarthome Projekt nicht, da meine Schalter a) nur Taster sind und b) extrem Flach.

Also schaute ich mir mal die Schaltung mit der Garagensteuerung an. Vom Prinzip her kann man die nehmen, aber nur vom Prinzip, den da wird nur 1 Relais geschaltet und ich brauche aber 7 Relais.

Auch kein Thema, dann wird in dem Sketch etwas geändert.

Die Installation wie beim Thema Garagensteuerung ist soweit für mein Projekt OK, so sollte man das auch machen, aber und jetzt kommt es. Dort wird in den Parametereinstellungen bei dem Garagensender "shift" + "Zahl 0 oder 1" benutzt.

Da ich 7 Relais für meine Lichtanlage brauche, muss ich  "Zahl 0 oder 1" in "Zahl 0 bis 7" ändern.

In den Orginalen Skript geht das natürlich nicht so, dazu muss man schon einiges ändern. So hier mal mein Skript dazu.

Bitte beachtet, das es NICHT MEHR FÜR EIN ARDUINO sondern für ein MINI D1 geschrieben ist. Dazu lest euch vorher alles zum Thema Garagensteuerung durch.

Hier der Skript von mir.

#include

/* ******************************** */
/*   CONFIGURATION START            */
/* ******************************** */

/* USED PINS */
#define RELAIS_PIN1    4 // D2  Relais

#define RELAIS_PIN2    5 // D1
#define RELAIS_PIN3    14 // D5
#define RELAIS_PIN4    16 // D0
#define RELAIS_PIN5    15 // D8
#define RELAIS_PIN6    13 // D7
#define RELAIS_PIN7    12 // D6
//#define RELAIS_PIN8    14 // D5

/* WLAN SETTINGS */
const char* WIFI_SSID = "EURER WLAN NAME";
const char* WIFI_PASSWORD = "EUER WLAN PASSWORT";

IPAddress ip(192, 168, 100, 47);
IPAddress gateway(192, 168, 100, 1);
IPAddress dns(192,168,100,1);
IPAddress subnet(255, 255, 255, 0);

/* ******************************** */
/*   CONFIGURATION END              */
/* ******************************** */
 
String sGetstart = "GET ";
WiFiServer server(80);
WiFiClient client;

/**
 * default initialization
 */
void setup() {
  pinMode(RELAIS_PIN1, OUTPUT);
  digitalWrite(RELAIS_PIN1, HIGH);
  pinMode(RELAIS_PIN2, OUTPUT);
  digitalWrite(RELAIS_PIN2, HIGH);
  pinMode(RELAIS_PIN3, OUTPUT);
  digitalWrite(RELAIS_PIN3, HIGH);
  pinMode(RELAIS_PIN4, OUTPUT);
  digitalWrite(RELAIS_PIN4, HIGH);
  pinMode(RELAIS_PIN5, OUTPUT);
  digitalWrite(RELAIS_PIN5, HIGH);
  pinMode(RELAIS_PIN6, OUTPUT);
  digitalWrite(RELAIS_PIN6, HIGH);
  pinMode(RELAIS_PIN7, OUTPUT);
  digitalWrite(RELAIS_PIN7, HIGH);
  //pinMode(RELAIS_PIN8, OUTPUT);
  //digitalWrite(RELAIS_PIN8, HIGH);
 
  Serial.begin(57600);
  delay(1);

  WiFi.mode(WIFI_STA);
  WiFiStart();
}


/**+
 * Main-Loop
 */
void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi restart");
    WiFiStart();
  }

  if (waitForClient()) {
    String request = client.readStringUntil('\r');
    client.flush();
   
    if (request != "") {
      Serial.print("Request: ");
      Serial.println(request);

      if(validateUrl(getUrlPath(request))) {
        showWebsite(handleWebRequest(getUrlParams(request)));
      }
    }

    client.stop();
  }
  delay(1);
}


/**
 * Shift relais for 1 second
 * hier bei shiftRelais() versuchen mit INT die einzelnen Ports anzusprechen
 */
 
void shiftRelais1(){
  digitalWrite(RELAIS_PIN1, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN1, HIGH);
}
void shiftRelais2(){
  digitalWrite(RELAIS_PIN2, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN2, HIGH);
}
void shiftRelais3(){
  digitalWrite(RELAIS_PIN3, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN3, HIGH);
}
void shiftRelais4(){
  digitalWrite(RELAIS_PIN4, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN4, HIGH);
}
void shiftRelais5(){
  digitalWrite(RELAIS_PIN5, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN5, HIGH);
}
void shiftRelais6(){
  digitalWrite(RELAIS_PIN6, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN6, HIGH);
}
void shiftRelais7(){
  digitalWrite(RELAIS_PIN7, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN7, HIGH);
}
/*void shiftRelais8(){
  digitalWrite(RELAIS_PIN8, LOW);
  delay(1000);
  digitalWrite(RELAIS_PIN8, HIGH);
}
*/

/**
 * handle single url-parameter
 */
boolean handleUrlParameter(String paramString){
  int splitIndex = paramString.indexOf("=");
  String pName = paramString.substring(0,splitIndex);
  String pValue = paramString.substring(splitIndex+1);
 
  Serial.print(pName); //Name shift
  Serial.print(" = ");
  Serial.println(pValue); // Schaltzustand

// Hier die Auswertung machen mit den einzelnen Kanaelen
// shift1 oder shift2 usw.
// Entweder mit If else oder mit while machen
 
  if(pName=="shift" && pValue =="0"){
    Serial.println("Schalte-Relais-1");
    shiftRelais1();
    return true;
  }
  else if(pName=="shift" && pValue=="1"){
    Serial.println("Schalte-Relais-2");
    shiftRelais2();
    return true;
  }
  else if(pName=="shift"&& pValue=="2"){
    Serial.println("Schalte-Relais-3");
    shiftRelais3();
    return true;
  }
  else if(pName=="shift"&& pValue=="3"){
    Serial.println("Schalte-Relais-4");
    shiftRelais4();
    return true;
  }
 else if(pName=="shift"&& pValue=="4"){
    Serial.println("Schalte-Relais-5");
    shiftRelais5();
    return true;
  }
else if(pName=="shift"&& pValue=="5"){
    Serial.println("Schalte-Relais-6");
    shiftRelais6();
    return true;
  }
else if(pName=="shift"&& pValue=="6"){
    Serial.println("Schalte-Relais-7");
    shiftRelais7();
    return true;
  }
/*else if(pName=="shift"&& pValue=="7"){
    Serial.println("Schalte-Relais-8");
    shiftRelais8();
    return true;
  }
*/
 
  return false;
}

/**
 * split url and handle the parameter
 */
boolean handleWebRequest(String request){
  int startIndex = request.indexOf("?")>=0?request.indexOf("?")+1:(request.indexOf("/")>=0?request.indexOf("/")+1:0);
  boolean handled = false;
 
  int i = 0;
  while(startIndex>=0 && request.length()>0){ // && request.indexOf("=")>=0
    request = request.substring(startIndex);
    int endIndex = request.indexOf("&")>=0?request.indexOf("&"):(request.indexOf(" ")>=0?request.indexOf(" "):request.length());
    String splitString = request.substring(0, endIndex);
    Serial.println(splitString);
 
    if(handleUrlParameter(splitString)){
      handled = true;
    }
    
    startIndex = request.indexOf("&")>=0?request.indexOf("&")+1:-1;
    i++;
  }
  return handled;
}

/**
 * get Paramss from Request-URL
 */
String getUrlParams(String request){
  String sParam = "";
 
  int iStart, iEndSpace, iEndQuest;
  iStart = request.indexOf(sGetstart);
  if (iStart >= 0) {
    iStart += +sGetstart.length();
    iEndSpace = request.indexOf(" ", iStart);
    iEndQuest = request.indexOf("?", iStart);

    if (iEndSpace > 0) {
      if (iEndQuest > 0) {
        sParam = request.substring(iEndQuest, iEndSpace);
      } 
    }       
  }
  return sParam;
}

/**
 * get Path from Request-URL
 */
String getUrlPath(String request){
  String sPath = "";
  int iStart, iEndSpace, iEndQuest;
  iStart = request.indexOf(sGetstart);
 
  if (iStart >= 0) {
    iStart += +sGetstart.length();
    iEndSpace = request.indexOf(" ", iStart);
    iEndQuest = request.indexOf("?", iStart);

    if (iEndSpace > 0) {
      sPath = request.substring(iStart, iEndQuest>0?iEndQuest:iEndSpace);
    }       
  }
  return sPath;
}

 
/**
 * Wait for Webclient connection
 */
boolean waitForClient() {
  client = server.available();
  if (!client) {
    return false;
  }

  Serial.println("new client");
  unsigned long timeout = millis() + 250;
  while (!client.available() && (millis() < timeout) ) {
    delay(1);
  }

  if (millis() > timeout) {
    Serial.println("client timed out!");
    return false;
  }

  return true;
}

/**
 * Check for valid URL
 * else show 404 error page
 */
boolean validateUrl(String urlPath){
  if (urlPath != "/" && urlPath != "/rawCmd") {
    String httpResponse, httpHeader;
    httpResponse = "404 Not Found

Requested URL  not found.

";
    httpResponse += "Dieses Gerät unterstützt keine Unterseiten in der URL.
";
    httpResponse += "Zum schalten des Relais muss der Parameter 'shift' in der URL angegeben sein.

";
    httpResponse += "Beispiel:
http://"; 
    httpResponse += ip[0];
    httpResponse += "."; 
    httpResponse += ip[1];
    httpResponse += "."; 
    httpResponse += ip[2];
    httpResponse += "."; 
    httpResponse += ip[3];
    httpResponse += "/?shift"; 

    httpResponse += "";

    httpHeader  = "HTTP/1.1 404 Not found\r\n";
    httpHeader += "Content-Length: ";
    httpHeader += httpResponse.length();
    httpHeader += "\r\n";
    httpHeader += "Content-Type: text/html\r\n";
    httpHeader += "Connection: close\r\n";
    httpHeader += "\r\n";

    client.print(httpHeader);
    client.print(httpResponse);

    return false;
  }
 
  return true;
}

/**
 * Show default website
 */
void showWebsite(boolean handledParameter){
  String httpResponse, httpHeader;

  httpResponse  = "

Demo für ESP8266 Steuerung";
  httpResponse += "";
  httpResponse += "";
  httpResponse += "

SmartHome yourself - Eltako-Controller

 


";
  if(handledParameter){
    httpResponse += "Der Schaltbefehl wurde ausgeführt.";
  } else {
    httpResponse += "Zum schalten des Relais muss der Parameter 'shift' in der URL angegeben sein.

";
    httpResponse += "Beispiel:
http://"; 
    httpResponse += ip[0];
    httpResponse += "."; 
    httpResponse += ip[1];
    httpResponse += "."; 
    httpResponse += ip[2];
    httpResponse += "."; 
    httpResponse += ip[3];
    httpResponse += "/?shift"; 
  }
  httpResponse += "";

  httpHeader  = "HTTP/1.1 200 OK\r\n";
  httpHeader += "Content-Length: ";
  httpHeader += httpResponse.length();
  httpHeader += "\r\n";
  httpHeader += "Content-Type: text/html\r\n";
  httpHeader += "Connection: close\r\n";
  httpHeader += "\r\n";

  client.print(httpHeader);
  client.print(httpResponse);
}

/**
 * Initialize WiFi
 */
void WiFiStart() {
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);

  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

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

  server.begin();

  Serial.println(WiFi.localIP());
}
 

Code zum Downloaden

 

Es ist jetzt nicht die perfekte Lösung, da man das bestimt Programmtechnisch ändern kann, aber es geht zumindestens bei mir.

Vergesst nicht die IP Adresse zuändern auf euer Heimnetz und das andere mit dem WLAN.

Soviel erst mal für Heute.

 

mfg  MIC

 

 

 

 

 

 


Lesen sie mehr: