#include "Domoticz.h" Domoticz::Domoticz(String domoticz, String port, const char* ssid, const char* pass) { _domoticz = domoticz; _port = port; _ssid = ssid; _pass = pass; // // Domo // _domoc[_domoticz.length() + 1]; // _domoticz.toCharArray(_domoc, _domoticz.length() + 1); // // // Port // char portc[_port.length() + 1]; // _port.toCharArray(portc, _port.length() + 1); // _iport = atoi(portc); } boolean Domoticz::connect() { // Domo char _domoc[_domoticz.length() + 1]; _domoticz.toCharArray(_domoc, _domoticz.length() + 1); // Port char portc[_port.length() + 1]; _port.toCharArray(portc, _port.length() + 1); int _iport = atoi(portc); boolean connected = _client.connect(_domoc, _iport); Serial.print(_domoc); Serial.print(" "); Serial.print(_iport); Serial.print(" "); Serial.print(" connected "); Serial.println(connected); return connected; } void Domoticz::close() { } void Domoticz::initWifi() { WiFi.mode(WIFI_AP); WiFi.begin(_ssid, _pass); //Connect to local Wifi Serial.println(); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("WiFi Connected!"); Serial.print("Connexion au reseau "); Serial.println(WiFi.localIP()); } void Domoticz::initWifiStatic( IPAddress ip, IPAddress gateway, IPAddress subnet, IPAddress DNS) { WiFi.config(ip, gateway, subnet, DNS); delay(100); WiFi.mode(WIFI_STA); WiFi.begin(_ssid, _pass); Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(200); } while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println(); Serial.println("Fail connecting"); delay(5000); ESP.restart(); } Serial.print(" static OK "); Serial.print("Module IP: "); Serial.println(WiFi.localIP()); } String Domoticz::generateKey() { // WiFi.mode(WIFI_AP); // Do a little work to get a unique-ish name. Append the // last two bytes of the MAC (HEX'd) to "Thing-": uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFi.softAPmacAddress(mac); String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); macID.toUpperCase(); String AP_NameString = "ESP8266 Thing " + macID; char AP_NameChar[AP_NameString.length() + 1]; memset(AP_NameChar, 0, AP_NameString.length() + 1); for (int i = 0; i < AP_NameString.length(); i++) { AP_NameChar[i] = AP_NameString.charAt(i); } // WiFi.softAP(AP_NameChar, WiFiAPPSK); Serial.println("macID=" + macID); return macID; } //void Domoticz::getIdFromDomoticz(String macID, Params * params) //{ // String separator = ","; // int nb = 0; // // Serial.println("Dans getIdFromDomoticz " + macID); // // // ------------------- // // LECTURE PARAM // // ------------------- // if (params->esp8266_id == "") { // boolean connected = connect(); // // if (connected) { // Serial.println("Connected to domoticz"); // executeJson("/json.htm?type=command¶m=getuservariables", "", ""); // // Read the first line of the request // while (1) { // String req = readLine(); // if (req.indexOf(macID) != -1) { // Serial.println(req); // req = readLine(); // req = readLine(); // String val = req.substring(req.indexOf(":") + 2, req.length() - 1); // Serial.println(val); // val.replace("\"", ""); // params->esp8266_id = getIndexOfString(val, separator, 0); // String tmp = getIndexOfString(val, separator, 1); // if (tmp != "") { // char tmpc[tmp.length() + 1]; // tmp.toCharArray(tmpc, tmp.length() + 1); // params->sleepTime = atoi(tmpc); // if (params->sleepTime <= 0) { // params->sleepTime = 60; // } // } // params->esp8266_id_Vcc = getIndexOfString(val, separator, 2); // // params->esp8266_id_lum = getIndexOfString(val, separator, 3); // Serial.println("val1=" + params->esp8266_id); // Serial.print("val2="); // Serial.println(params->sleepTime); // Serial.println("val3=" + params->esp8266_id_Vcc); // Serial.println("val4=" + params->esp8266_id_lum); // // break; // } // if (req == "" || nb > 500) { // break; // } // nb++; // } // _client.stop(); // delay(100); // } // } // //} IPAddress Domoticz::getIP(String macId) { IPAddress ip; //(192, 168, 1, 222); String fst = macId.substring(0, 2); String sec = macId.substring(2); char fstc[fst.length() + 1]; fst.toCharArray(fstc, fst.length() + 1); char secc[sec.length() + 1]; sec.toCharArray(secc, fst.length() + 1); return IPAddress(192, 168, strtol(fstc, 0, 16), strtol(secc, 0, 16)); } void Domoticz::executeJson(String json, String svalue, String nvalue) { // Domo char _domoc[_domoticz.length() + 1]; _domoticz.toCharArray(_domoc, _domoticz.length() + 1); // Port char portc[_port.length() + 1]; _port.toCharArray(portc, _port.length() + 1); int _iport = atoi(portc); _client.print("GET " + json); //"GET /json.htm?type=command¶m=getuservariables"); if (svalue != "") { _client.print("&svalue=" + svalue); } if (nvalue != "") { _client.print("&nvalue=" + nvalue); } Serial.println(json + "&svalue=" + svalue + "&nvalue=" + nvalue); _client.println(" HTTP/1.1"); _client.print("Host: "); _client.print(_domoc); _client.print(":"); _client.println(_iport); _client.println("User-Agent: Arduino-ethernet"); _client.println("Connection: close"); _client.println(); } void Domoticz::readResponse() { int x = 0; // variable for looping char dataStr[16]; //array to store the response char c; while(_client.available()) { //_client.connected() || _client.available()) { String req = readLine(); Serial.println(req); if (req == "") { break; } // c = _client.read(); //read first character // while (c!= '<') { //while < character is not coming yet, keep reading character // c = _client.read(); // } // c = _client.read(); //read the '<' character, but not storing in array // while (c != '>') { //while > character is not coming yet, // dataStr[x] = c; //Store character in array // x++; //incrementing index array // } // for (x=0; x<12; x++) { // Serial.print(dataStr[x]); // } } Serial.println("Fin rĂ©ponse"); } //-------------------------------------------------------------------------------------------------- // Read current supply voltage //-------------------------------------------------------------------------------------------------- String Domoticz::readVcc() { // most exact output uint16_t v = ESP.getVcc(); float_t v_cal = ((float) v / 1024.0f); char v_str[10]; dtostrf(v_cal, 5, 3, v_str); sprintf(v_str, "%s", v_str); Serial.print("Tension lue "); Serial.println(String(v_str)); return String(v_str); //ESP.getVcc() / 1024.0f; // Vcc in millivolts } String Domoticz::getIndexOfString(String data, String separator, int index) { int found = 0; int strIndex[] = { 0, -1 }; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator.charAt(0) || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i + 1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; } String Domoticz::readLine() { return _client.readStringUntil('\n'); } void Domoticz::readTempDayValues(String idx) { String json = "/json.htm?type=graph&sensor=temp&idx=" + idx + "&range=day"; int nb = 0; int nbVal = 0; Serial.println("readTempDayValues " + idx); connect(); executeJson(json, "", ""); while (1) { String line = readLine(); if (line == "") { break; } if (line.indexOf("\"te\"") != -1) { //Serial.print(line + " "); nbVal++; if (nbVal % 10) { String val = line.substring(line.indexOf(":") + 2, line.length()); // Serial.println(val); } } nb++; } Serial.print("Nombre de lignes "); Serial.println(nb); close(); } int Domoticz::strToHex(char str[]) { return (int) strtol(str, 0, 16); }