first commit

This commit is contained in:
Jérôme Delacotte
2025-03-06 11:15:32 +01:00
commit 7b30d6e298
5276 changed files with 2108927 additions and 0 deletions

View File

@@ -0,0 +1,280 @@
#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.print(connected);
Serial.print(" ");
Serial.println(WiFi.localIP());
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());
}
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);
_macID = macID;
return macID;
}
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&param=getuservariables");
if (svalue != "") {
_client.print("&svalue=" + svalue);
}
if (nvalue != "") {
_client.print("&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();
Serial.println("json=" + json);
}
//--------------------------------------------------------------------------------------------------
// 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;
data = "";
labels = "";
String label = "";
Serial.println("readTempDayValues " + idx);
connect();
executeJson(json, "", "");
while (1)
{
// Avoid WDT reset during long process
yield();
String line = readLine();
if (line == "") {
break;
}
if (line.indexOf("\"d\"") != -1) {
//Serial.println(line + " ");
label = line.substring(line.indexOf(":") + 2, line.length());
}
if (line.indexOf("\"te\"") != -1) {
// Serial.println(line + " ");
nbVal++;
if (nbVal % 10) {
String val = line.substring(line.indexOf(":") + 2, line.indexOf(".") + 2);
if (val != NULL) {
//Serial.println(val);
if (data == "") {
data += val;
labels = "\"0\"";
} else {
char charBuf[50];
// val.toCharArray(charBuf, 50);
data += "," + val; //printf("%2.1f", atof(charBuf));
// data += "," + val;
// Serial.println(printf("%2.1f", atof(charBuf)));
labels = labels + label;
}
if (data.length() > 500) {
data = data.substring(data.indexOf(",") + 1);
labels = labels.substring(labels.indexOf(",") + 1);
}
yield();
}
}
}
nb++;
}
// Avoid WDT reset during long process
yield();
// Serial.println(data);
// Serial.println(labels);
yield();
Serial.print("Nombre de lignes ");
Serial.println(nb);
close();
}
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&param=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);
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);
Serial.println("esp8266_id=" + params->esp8266_id);
Serial.println("sleepTime=" + tmp);
Serial.println("esp8266_id_Vcc=" + params->esp8266_id_Vcc);
break;
}
if (req == "" || nb > 500) {
break;
}
nb++;
}
_client.stop();
delay(100);
}
}
}

View File

@@ -0,0 +1,38 @@
#ifndef Domoticz_h
#define Domoticz_h
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "Params.h"
class Domoticz
{
public:
Domoticz(String domoticz, String port, const char* ssid, const char* pass);
boolean connect();
void close();
void initWifi();
void executeJson(String json, String svalue, String nvalue);
//String getIdFromDomoticz();
String generateKey();
String readLine();
String readVcc();
void readTempDayValues(String idx);
void getIdFromDomoticz(String macID, Params * params);
static String getIndexOfString(String data, String separator, int index);
private:
public:
const char* _pass;
const char* _ssid;
WiFiClient _client;
char _domoc[];
int _iport;
String _domoticz;
String _port;
String _macID;
String data = "";
String labels = "";
};
#endif

View File

@@ -0,0 +1,145 @@
//extern "C" {
//#include "user_interface.h"
//}
// Need for getVcc
ADC_MODE(ADC_VCC);
/////////////////////
// Domoticz Classe
/////////////////////
#include "Domoticz.h"
Domoticz domo("192.168.1.3", "81", "Livebox-37cc", "8A6060920A8A86896F770F2C47");
#include "Modules.h"
Modules modules;
Params * params;
#include "ServeurWeb.h"
ServeurWeb * serveurWeb;
WiFiServer server(80);
#include "Octoprint.h"
Octoprint octoprint("192.168.1.3", "5000", "B5746ACFF37140D0B5F6FEAAC4413B5C");
#include "Files.h"
Files * files;
// Convert image to char array http://www.digole.com/tools/PicturetoC_Hex_converter.php
Params p;
ServeurWeb sw;
// domoticz
String macID = "";
unsigned long milli;
void setup()
{
Serial.begin(9600);
// /* sda scl */
// Wire.pins(SDA, SCL);
// Wire.begin(SDA, SCL);
// Conversion d'objet en pointeur
params = &p;
serveurWeb = &sw;
serveurWeb->domoticz = &domo;
serveurWeb->modules = &modules;
serveurWeb->server = &server;
serveurWeb->server->begin();
delay(100);
domo.initWifi();
macID = domo.generateKey();
domo.getIdFromDomoticz(macID, params);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH);
// octoprint.connect();
// octoprint.executeJson("/api/printer", "", "");
// octoprint.executeJsonPost("/api/printer/command", "{\"command\": \"M503\"}");
milli = 0; millis();
delay(100);
files->init();
delay(100);
EEPROM.begin(512);
}
void loop()
{
serveurWeb->loop();
// yield();
// files->ftpSrv.handleFTP(); //make sure in loop you call handleFTP()!!
// yield();
if (milli == 0 || milli + params->sleepTime * 1000 <= millis() ) {
// Avoid WDT reset during long process
yield();
milli = millis();
modules.readTemp();
printInfo();
LittleFS.mkdir("/data");
files->listDir("/");
// Serial.println("SSID=" + serveurWeb->eeprom->readString(0));
// Serial.println("Pass=" + serveurWeb->eeprom->readString(20));
// Serial.println("Domo=" + serveurWeb->eeprom->readString(40));
// Serial.println("Port=" + serveurWeb->eeprom->readString(60));
// Test Json
domo.readTempDayValues(params->esp8266_id);
}
}
void printInfo()
{
boolean connected = domo.connect();
Serial.println("Dans printInfo " + connected + ' ' + params->esp8266_id);
yield();
// Domoticz format /json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT
if (connected && params->esp8266_id != "") {
Serial.println("Dans set temperature" + String(modules.temp));
//domo.executeJson();
if (modules.temp < 50 && modules.temp > 0) {
String svalue = String(modules.temp) + ";" + String(modules.humidity) + ";0";
Serial.println(svalue);
domo.executeJson("/json.htm?type=command&param=udevice&idx=" + params->esp8266_id, svalue, "0");
yield();
domo._client.stop();
yield();
}
delay(200);
}
connected = domo.connect();
if (connected && params->esp8266_id_Vcc != "") {
Serial.print(" Envoi tension ");
Serial.print(params->esp8266_id_Vcc);
Serial.print(" ");
yield();
String vcc = domo.readVcc();
Serial.println(vcc);
yield();
// domo._client.print("GET /json.htm?type=command&param=udevice&idx=");
domo.executeJson("/json.htm?type=command&param=udevice&idx=" + params->esp8266_id_Vcc, vcc, "0");
domo._client.stop();
yield();
}
}

View File

@@ -0,0 +1,56 @@
#include "Eeprom.h"
Eeprom::Eeprom()
{
// EEPROM.begin(512);
}
// int Eeprom::readValueAt(int position, int size)
// {
// EEPROM.begin(size);
// // read the last LED state from flash memory
// return EEPROM.read(position);
// }
// void Eeprom::writeValueAt(int position, int size, int value)
// {
// EEPROM.write(position, value);
// EEPROM.commit();
// }
// void Eeprom::writeString(int position, String value)
// {
// for(int i=0 ; i < value.length() ; i++)
// {
// EEPROM.write( i + position,value[i] );
// }
// EEPROM.commit();
// }
void Eeprom::writeString(char add,String data)
{
int _size = data.length();
int i;
for(i=0;i<_size;i++)
{
EEPROM.write(add+i,data[i]);
}
EEPROM.write(add+_size,'\0'); //Add termination null character for String Data
EEPROM.commit();
}
String Eeprom::readString(char position)
{
int i;
char data[100]; //Max 100 Bytes
int len=0;
unsigned char k;
k=EEPROM.read(position);
while(k != '\0' && len<500) //Read until null character
{
k=EEPROM.read(position+len);
data[len]=k;
len++;
}
data[len]='\0';
return String(data);
}

View File

@@ -0,0 +1,21 @@
#ifndef Eeprom_h
#define Eeprom_h
// include library to read and write from flash memory
#include <EEPROM.h>
#include <Arduino.h>
class Eeprom {
public :
Eeprom();
public :
// void writeValueAt(int position, int size, int value);
// int readValueAt(int position, int size);
//void writeString(int position, String value);
void writeString(char add,String data);
String readString(char position);
// void readString(int position, String value);
};
#endif

View File

@@ -0,0 +1,168 @@
/* Example showing timestamp support in LittleFS */
/* Released into the public domain. */
/* Earle F. Philhower, III <earlephilhower@yahoo.com> */
#include "Files.h"
bool Files::getLocalTime(struct tm * info, uint32_t ms) {
uint32_t count = ms / 10;
time_t now;
time(&now);
localtime_r(&now, info);
if (info->tm_year > (2016 - 1900)) {
return true;
}
while (count--) {
delay(10);
time(&now);
localtime_r(&now, info);
if (info->tm_year > (2016 - 1900)) {
return true;
}
}
return false;
}
void Files::listDir(const char * dirname) {
Serial.printf("Listing directory: %s\n", dirname);
Dir root = LittleFS.openDir(dirname);
while (root.next()) {
File file = root.openFile("r");
Serial.print(" FILE: ");
Serial.print(root.fileName());
Serial.print(" SIZE: ");
Serial.print(file.size());
time_t cr = file.getCreationTime();
time_t lw = file.getLastWrite();
file.close();
struct tm * tmstruct = localtime(&cr);
Serial.printf(" CREATION: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
tmstruct = localtime(&lw);
Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
}
}
void Files::readFile(const char * path) {
Serial.printf("Reading file: %s\n", path);
File file = LittleFS.open(path, "r");
if (!file) {
Serial.println("Failed to open file for reading");
return;
}
Serial.print("Read from file: ");
while (file.available()) {
Serial.write(file.read());
}
file.close();
}
void Files::writeFile(const char * path, const char * message) {
Serial.printf("Writing file: %s\n", path);
File file = LittleFS.open(path, "w");
if (!file) {
Serial.println("Failed to open file for writing");
return;
}
if (file.print(message)) {
Serial.println("File written");
} else {
Serial.println("Write failed");
}
delay(2000); // Make sure the CREATE and LASTWRITE times are different
file.close();
}
void Files::appendFile(const char * path, const char * message) {
Serial.printf("Appending to file: %s\n", path);
File file = LittleFS.open(path, "a");
if (!file) {
Serial.println("Failed to open file for appending");
return;
}
if (file.print(message)) {
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
void Files::renameFile(const char * path1, const char * path2) {
Serial.printf("Renaming file %s to %s\n", path1, path2);
if (LittleFS.rename(path1, path2)) {
Serial.println("File renamed");
} else {
Serial.println("Rename failed");
}
}
void Files::deleteFile(const char * path) {
Serial.printf("Deleting file: %s\n", path);
if (LittleFS.remove(path)) {
Serial.println("File deleted");
} else {
Serial.println("Delete failed");
}
}
void Files::init() {
// /////FTP Setup, ensure SPIFFS is started before ftp; /////////
// #ifdef ESP32 //esp32 we send true to format spiffs if cannot mount
// if (SPIFFS.begin(true)) {
// #elif defined ESP8266
// if (SPIFFS.begin()) {
// #endif
// Serial.println("SPIFFS opened!");
// ftpSrv.begin("esp8266","esp8266"); //username, password for ftp. set ports in ESP8266FtpServer.h (default 21, 50009 for PASV)
// }
LittleFSConfig cfg;
cfg.setAutoFormat(false);
LittleFS.setConfig(cfg);
// configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");
// struct tm tmstruct ;
// delay(2000);
// tmstruct.tm_year = 0;
// getLocalTime(&tmstruct, 5000);
// Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct.tm_year) + 1900, (tmstruct.tm_mon) + 1, tmstruct.tm_mday, tmstruct.tm_hour, tmstruct.tm_min, tmstruct.tm_sec);
// Serial.println("");
// Serial.println("Formatting LittleFS filesystem");
// LittleFS.format();
Serial.println("Mount LittleFS");
if (!LittleFS.begin()) {
Serial.println("LittleFS mount failed");
return;
}
// listDir("/");
// deleteFile("/hello.txt");
// writeFile("/hello.txt", "Hello ");
// appendFile("/hello.txt", "World!\n");
// listDir("/");
// Serial.println("The timestamp should be valid above");
// Serial.println("Now unmount and remount and perform the same operation.");
// Serial.println("Timestamp should be valid, data should be good.");
// LittleFS.end();
// Serial.println("Now mount it");
// if (!LittleFS.begin()) {
// Serial.println("LittleFS mount failed");
// return;
// }
// readFile("/hello.txt");
// listDir("/");
}

View File

@@ -0,0 +1,27 @@
#ifndef Files_h
#define Files_h
#include <Arduino.h>
#include <FS.h>
#include <LittleFS.h>
#include <time.h>
#include <ESP8266FtpServer.h>
class Files {
public :
Files();
bool getLocalTime(struct tm * info, uint32_t ms);
void deleteFile(const char * path);
void renameFile(const char * path1, const char * path2);
void appendFile(const char * path, const char * message);
void writeFile(const char * path, const char * message);
void readFile(const char * path);
void listDir(const char * dirname);
void init();
public:
FtpServer ftpSrv;
long timezone = 2;
byte daysavetime = 1;
};
#endif

View File

@@ -0,0 +1,60 @@
#include "Modules.h"
// int status = WL_IDLE_STATUS; // the Wifi radio's status
//WiFiClient client;
// Dallas
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
Modules::Modules()
{
Serial.println("--------------------------------------");
Serial.println("Init Module");
pinMode(RELAY_PIN, OUTPUT);
pinMode(RELAY_PIN_02, OUTPUT);
pinMode(RELAY_PIN_03, OUTPUT);
pinMode(RELAY_PIN_04, OUTPUT);
delay(200);
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(RELAY_PIN_02, HIGH);
digitalWrite(RELAY_PIN_03, HIGH);
digitalWrite(RELAY_PIN_04, HIGH);
}
bool Modules::readTemp()
{
//DS18B20.begin();
Serial.println("--------------------------------------");
DS18B20.requestTemperatures();
temp = DS18B20.getTempCByIndex(0);
Serial.print("Température Dallas =");
Serial.println(temp);
if (temp > 0 && temp < 70) {
return true;
}
return false;
}
void Modules::sleep(int sleepTime)
{
Serial.print("Go to sleep ");
Serial.println(sleepTime);
delay(20);
ESP.deepSleep(sleepTime * 1000000L); // Infini
//sleepWifi();
delay(200);
}
void Modules::relay(int pin, int value)
{
delay(100);
digitalWrite(pin, value);
delay(100);
}

View File

@@ -0,0 +1,28 @@
#ifndef Modules_h
#define Modules_h
#include <Arduino.h>
#include <DallasTemperature.h>
#include "Pins.h"
// ################# Barometre ####
#define ALTITUDE 19.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters
//SFE_BMP180 pressure;
// #####################
class Modules
{
public:
Modules();
bool readTemp();
void sleep(int sleepTime);
void relay(int pin, int value);
private:
public:
double humidity = 0;
double temp = 0;
int end_filament = 0;
};
#endif

View File

@@ -0,0 +1,178 @@
#include "Octoprint.h"
Octoprint::Octoprint(String octoprint, String port, String API)
{
_octoprint = octoprint;
_port = port;
_API = API;
}
boolean Octoprint::connect()
{
// Domo
char _octo[_octoprint.length() + 1];
_octoprint.toCharArray(_octo, _octoprint.length() + 1);
// Port
char portc[_port.length() + 1];
_port.toCharArray(portc, _port.length() + 1);
int _iport = atoi(portc);
boolean connected = _client.connect(_octo, _iport);
Serial.print(_octo);
Serial.print(" ");
Serial.print(_iport);
Serial.print(" ");
Serial.print(" connected ");
Serial.print(connected);
Serial.print(" ");
Serial.println(WiFi.localIP());
return connected;
}
void Octoprint::close()
{
}
void Octoprint::executeJson(String json, String svalue, String nvalue)
{
// Domo
char _octo[_octoprint.length() + 1];
_octoprint.toCharArray(_octo, _octoprint.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&param=getuservariables");
if (svalue != "") {
_client.print("&svalue=" + svalue);
}
if (nvalue != "") {
_client.print("&nvalue=" + nvalue);
}
_client.println(" HTTP/1.1");
_client.print("Host: ");
_client.print(_octo);
_client.print(":");
_client.println(_iport);
_client.println("User-Agent: Arduino-ethernet");
_client.println("X-Api-Key:" + _API);
_client.println("Connection: close");
_client.println();
Serial.println("json=" + json);
long interval = 2000;
unsigned long currentMillis = millis(), previousMillis = millis();
while(!_client.available()){
if( (currentMillis - previousMillis) > interval ){
Serial.println("Timeout");
_client.stop();
return;
}
currentMillis = millis();
}
// while (_client.connected())
// {
// if ( _client.available() )
// {
// char str=_client.read();
// Serial.print(str);
// }
// }
while (1)
{
// Avoid WDT reset during long process
yield();
String line = readLine();
if (line == "") {
break;
}
Serial.println(line);
}
}
void Octoprint::executeJsonPost(String json, String postData)
{
if (connect()) {
_client.println("POST " +json + " HTTP/1.1");
_client.println("Host: " + _octoprint + ":" + _port);
_client.println("Cache-Control: no-cache");
_client.println("X-Api-Key:" + _API);
_client.println("Content-Type: application/json");
_client.print("Content-Length: ");
_client.println(postData.length());
_client.println();
_client.println(postData);
long interval = 2000;
unsigned long currentMillis = millis(), previousMillis = millis();
while(!_client.available()){
if( (currentMillis - previousMillis) > interval ){
Serial.println("Timeout");
_client.stop();
return;
}
currentMillis = millis();
}
// while (_client.connected())
// {
// if ( _client.available() )
// {
// char str=_client.read();
// Serial.print(str);
// }
// }
while (1)
{
// Avoid WDT reset during long process
yield();
String line = readLine();
if (line == "") {
break;
}
Serial.println(line);
}
}
}
String Octoprint::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 Octoprint::readLine()
{
return _client.readStringUntil('\n');
}

View File

@@ -0,0 +1,33 @@
#ifndef Octoprint_h
#define Octoprint_h
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "Params.h"
class Octoprint
{
public:
Octoprint(String octoprint, String port, String API);
boolean connect();
void close();
void executeJson(String json, String svalue, String nvalue);
void executeJsonPost(String json, String postData);
//String getIdFromOctoprint();
String readLine();
static String getIndexOfString(String data, String separator, int index);
private:
const char* _pass;
public:
const char* _ssid;
WiFiClient _client;
char _octo[];
int _iport;
String _octoprint;
String _port;
String _API;
};
#endif

View File

@@ -0,0 +1,7 @@
#include "Params.h"
Params::Params()
{
}

View File

@@ -0,0 +1,15 @@
#ifndef Params_h
#define Params_h
#include <Arduino.h>
class Params {
public :
Params();
public :
String esp8266_id;
String esp8266_id_Vcc;
int sleepTime;
};
#endif

View File

@@ -0,0 +1,29 @@
#ifndef Pins_h
#define Pins_h
#include <Arduino.h>
#define SDA D1
#define SCL D2
#define ONE_WIRE_BUS D4 // DS18B20 pin
#define RELAY_PIN D5
#define RELAY_PIN_02 D6
#define RELAY_PIN_03 D7
#define RELAY_PIN_04 D0
#define FILAMENT_DETECTION 0
#endif
// #define D0 16
// #define D1 5 // I2C Bus SCL (clock)
// #define D2 4 // I2C Bus SDA (data)
// #define D3 0
// #define D4 2 // Same as "LED_BUILTIN", but inverted logic
// #define D5 14 // SPI Bus SCK (clock)
// #define D6 12 // SPI Bus MISO
// #define D7 13 // SPI Bus MOSI
// #define D8 15 // SPI Bus SS (CS)
// #define D9 3 // RX0 (Serial console)
// #define D10 1 // TX0 (Serial console)

View File

@@ -0,0 +1,909 @@
#include "ServeurWeb.h"
#include <ESP8266WiFi.h>
#include "Pins.h"
ServeurWeb::ServeurWeb()
{
Serial.println("--------------------------------------");
Serial.println("Init ServeurWeb");
//domoticz = _domoticz;
// WifiServer server(80);
//server->begin();
}
void ServeurWeb::loop()
{
//Serial.println("--------------------------------------");
//Serial.println("Loop ServeurWeb");
// read the state of the end button value:
modules->end_filament = digitalRead(FILAMENT_DETECTION);
//Serial.println('fin de filament ' + modules->end_filament);
if ((bcl % (refresh * 60)) == 0) { //DELAI_LECTURE == 0) {
// infos();
nbData += 1;
nbData = nbData % 256;
}
// Check if a client has connected
client = server->available();
if (!client) {
// infos();
// delay(1000);
bcl++;
return;
}
// Read the first line of the request
String req = client.readStringUntil('\r');
Serial.println(req);
// client.flush();
// Match the request
int val = -1; // We'll use 'val' to keep track of both the
// request type (read/set) and value if set.
if (req.indexOf("/admin") != -1) {
val = -3;
//int end = readPage(START_ADDRESS);
//pageAdmin();
pageMenu(PAGE_ADMIN);
} else if (req.indexOf("/graph") != -1) {
pageMenu(PAGE_GRAPH);
} else if (req.indexOf("/reset") != -1) {
client.println("Reset done. SSID, PASS, Domoticz, port & id cleaned.");
delay(100);
} else if (req.indexOf("/ident") != -1) {
ident(req);
} else if (req.indexOf("/status") != -1) {
//printWifiStatus();
pageMenu(PAGE_STATUS);
} else if (req.indexOf("/infos") != -1) {
pageMenu(PAGE_INFOS);
} else if (req.indexOf("/relay_01") != -1) {
client.print("relay_01=");
client.print(val0); //digitalRead(0));
delay(100);
} else if (req.indexOf("/relay_02") != -1) {
client.print("relay_02=");
client.print(val2); //digitalRead(2));
delay(100);
} else if (req.indexOf("/action") != -1) {
// Affectation des variables aux sorties correspondantes
if (req.indexOf("relay_01=false") != -1)
{
val0 = HIGH;
modules->relay(RELAY_PIN, val0);
}
if (req.indexOf("relay_01=true") != -1)
{
val0 = LOW;
modules->relay(RELAY_PIN, val0);
}
if (req.indexOf("relay_02=false") != -1)
{
val2 = HIGH;
digitalWrite(RELAY_PIN_02, val2);
}
if (req.indexOf("relay_02=true") != -1)
{
val2 = LOW;
digitalWrite(RELAY_PIN_02, val2);
}
if (req.indexOf("relay_03=false") != -1)
{
val3 = HIGH;
digitalWrite(RELAY_PIN_03, val3);
}
if (req.indexOf("relay_03=true") != -1)
{
val3 = LOW;
digitalWrite(RELAY_PIN_03, val3);
}
if (req.indexOf("relay_04=false") != -1)
{
val4 = HIGH;
digitalWrite(RELAY_PIN_04, val4);
}
if (req.indexOf("relay_04=true") != -1)
{
val4 = LOW;
digitalWrite(RELAY_PIN_04, val4);
}
Serial.println("Val0=" + String(val0) + " Val2=" + String(val2)
+ " Val3=" + String(val3) + " Val4=" + String(val4));
pageMenu(PAGE_MENU);
} else if (req.indexOf("/menu") != -1) {
//pageMenu();
pageMenu(PAGE_MENU);
} else {
pageMenu(PAGE_MENU);
}
//client.stop();
// The client will actually be disconnected
// when the function returns and 'client' object is detroyed
}
String ServeurWeb::getValueFrom(String request, int deb, int fin) {
int bufLength = ((fin) - (deb + 5)); //the 5 is for the "name=" string
String tmp = request.substring((deb + 5), (fin - 1));
return tmp;
}
char* ServeurWeb::convertToChar(String s, char* buf) {
char c[s.length() + 1];
s.toCharArray(c, s.length() + 1);
return c;
}
void ServeurWeb::infos()
{
int nb = 0;
//WiFiClient client2; // = domoticz->_client;
// Domoticz format /json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT
// Type
// 0 = Integer, e.g. -1, 1, 0, 2, 10
//1 = Float, e.g. -1.1, 1.2, 3.1
//2 = String
//3 = Date in format DD/MM/YYYY
//4 = Time in 24 hr format HH:MM
//5 = DateTime (but the format is not checked)
// SAve variable "json.htm?type=command&param=saveuservariable&vname=" + domoticz->_macID + "uservariablename&vtype=2&vvalue=uservariablevalue"
// GEt Variables
// http://192.168.0.10:8080/json.htm?type=command&param=getuservariables&idx=4
// // Domo
// char domoticz->_domoc[domoticz.length() + 1];
// domoticz.toCharArray(domoticz->_domoc, domoticz.length() + 1);
// // Port
// char portc[port.length() + 1];
// port.toCharArray(portc, port.length() + 1);
// int domoticz->_iport = atoi(portc);
Serial.print(domoticz->_domoticz);
Serial.print(" ");
Serial.println(domoticz->_port);
Serial.print(" radiateur=");
Serial.print(radiateur);
Serial.print(" temperature=");
Serial.print(temp);
Serial.print(" consigne=");
Serial.print(cons);
Serial.println("");
// Avoid WDT reset during long process
yield();
// -------------------
// LECTURE PARAM
// -------------------
if (radiateur == "") {
Serial.println("Lecture parametre dans domoticz");
if (domoticz->connect()) {
Serial.println("Connected to domoticz");
domoticz->executeJson("/json.htm?type=command&param=getuservariables", "", "");
// Read the first line of the request
while (1) {
// Avoid WDT reset during long process
yield();
String req = domoticz->readLine();
// Serial.println(req);
if (req.indexOf(domoticz->_macID) != -1) {
Serial.println(req);
// Serial.println(req);
req = domoticz->readLine();
req = domoticz->readLine();
String val = req.substring(req.indexOf(":") + 2, req.length() - 1);
Serial.println(val);
val.replace("\"", "");
radiateur = domoticz->getIndexOfString(val, separator, 0);
temp = domoticz->getIndexOfString(val, separator, 1);
cons = domoticz->getIndexOfString(val, separator, 2);
refresh = domoticz->getIndexOfString(val, separator, 3).toInt();
nom = domoticz->getIndexOfString(val, separator, 4);
for (int cpt = 0; cpt < 5; cpt++ ) {
Serial.print(domoticz->getIndexOfString(val, separator, cpt));
}
Serial.println("");
Serial.println("radiateur=" + radiateur);
Serial.println("temp=" + temp);
Serial.println("cons=" + cons);
break;
}
if (req == "" || nb > 500) {
break;
}
nb++;
}
//client2.stop();
delay(100);
}
}
if (radiateur != "") {
if (domoticz->connect()) {
Serial.println("Connected to domoticz lecteur statut radiateur" );
domoticz->executeJson("/json.htm?type=devices&rid=" + radiateur, "", "");
// Read the first line of the request
while (1) {
// Avoid WDT reset during long process
yield();
String req = domoticz->readLine();
if (req.indexOf("\"Status\"") != -1) {
Serial.println(req.substring(req.indexOf(":") + 2));
break;
}
if (req == "" || nb > 500) {
break;
}
nb++;
}
//client2.stop();
delay(100);
}
if (domoticz->connect()) {
Serial.println("Connected to domoticz lecture donnée température" );
domoticz->executeJson("/json.htm?type=devices&rid=723", "","");
// Read the first line of the request
while (1) {
// Avoid WDT reset during long process
yield();
String req = domoticz->readLine();
Serial.println(req);
if (req.indexOf("\"Temp\"") != -1) {
String tmp = req.substring(req.indexOf(":") + 2);
tmp = tmp.substring(0, tmp.indexOf(".") + 2);
Serial.println(tmp);
if (data == "") {
data += tmp;
labels = "\"0\"";
} else {
data += "," + tmp;
if (nbData % 10 == 0) {
labels = labels + "," + "\"" + nbData + "\"";
} else {
labels = labels + "," + "\"" + "\"";
}
}
if (data.length() > 500) {
data = data.substring(data.indexOf(",") + 1);
labels = labels.substring(labels.indexOf(",") + 1);
}
Serial.println(data);
Serial.println(labels);
break;
}
if (req == "" || nb > 500) {
break;
}
nb++;
}
//client2.stop();
delay(100);
}
if (domoticz->connect()) {
Serial.println("Connected to domoticz lecteur consigne" );
domoticz->executeJson("/json.htm?type=devices&rid=" + cons, "", "");
// Read the first line of the request
while (1) {
// Avoid WDT reset during long process
yield();
String req = domoticz->readLine();
if (req.indexOf("\"SetPoint\"") != -1) {
String value = req.substring(req.indexOf(":") + 2);
//value = .substring(req.indexOf(":") + 1);
value.trim();
Serial.println(value);
break;
}
if (req == "" || nb > 500) {
break;
}
nb++;
}
//client2.stop();
delay(100);
}
}
// Avoid WDT reset during long process
yield();
Serial.println("Fin infos");
// Avoid WDT reset during long process
yield();
}
void ServeurWeb::printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
// PAge
client.println("<p>Connected to ");
client.println(WiFi.SSID());
client.println("</p><p>Ip: ");
client.println(ip);
client.println("</p><p>Force du signal:");
client.println(rssi);
client.println(" dBm</p>");
client.println("<p>Domoticz:");
client.println(domoticz->_domoticz);
client.println(":");
client.println(domoticz->_port);
client.println("</p>");
//
// client.println("<div class='c100 p25 dark orange'>");
// client.println(" <span>25%</span>");
// client.println(" <div class='slice'>");
// client.println(" <div class='bar'></div>");
// client.println(" <div class='fill'></div>");
// client.println(" </div>");
// client.println("</div>");
client.println("<button class='boutonTemp' onclick='click()'>" + temp + "</button>");
client.println("<button class='boutonCons' onclick='click()'>" + cons + "</button>");
}
////////////////////////////////////////////
////// PAGE MENU
////////////////////////////////////////////
void ServeurWeb::pageMenu(int page) {
client.println("<html>");
client.println("<head>");
client.println("<link rel=\"shortcut icon\" href=\"http://" + domoticz->_domoticz + ":" + domoticz->_port + "/favicon.ico\">");
if (page == PAGE_GRAPH) {
client.println("<meta http-equiv=\"refresh\" content=\"60\" >");
}
if (page == PAGE_MENU) {
// // Look des champs de saisis
// client.println("<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"http://" + domoticz->_domoticz + "/ESP8266/css/styles.css\">");
// // Look Bouton toggle
// client.println("<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"http://" + domoticz->_domoticz + "/ESP8266/css/toggles-soft.css\">");
}
menuStyle(page);
client.println("</head>");
menuBody(page);
client.println("</html>\n\r");
}
void ServeurWeb::menuBody(int page) {
client.println("<body>");
client.println("<header role='banner'>");
client.println("<div class='wrapper'>");
client.print("<h1> ");
client.print(nom + " " + domoticz->_macID);
client.println("</h1>");
client.println("<nav id='nav' role='navigation'>");
client.println("<div class='show_menu_btn' data-target='#nav ul' data-shown-text='Hide menu' data-hidden-text='Show menu' >Show menu</div>");
client.println("<ul>");
client.println("<li><a href='/menu'>Menu</a></li>");
client.println("<li><a href='/admin'>Admin</a></li>");
//client.println("<li><a href='/infos'>Infos</a></li>");
client.println("<li><a href='/status'>Status</a></li>");
//client.println("<li><a href='/reset'>Reset</a></li>");
client.println("<li><a href='/graph'>Graph</a></li>");
//client.println("<li><a href='/aide'>Aide</a></li>");
client.println("</ul>");
client.println("</nav>");
client.println("</div>");
client.println("</header>");
client.println("<main role='main'>");
client.println("<div class='wrapper'>");
if (page == PAGE_MENU) {
client.print("<form><div><input type=\"checkbox\" id=\"relay_01\" onclick=\"handleClick(this);\" ");
if (val0 == 0) {
client.print("unchecked");
} else {
client.print("checked");
}
client.println("><label for=\"relay_01\" onclick=\"relay_01();\">Relai 1</label></div></form>");
client.println("<form><div><input type=\"checkbox\" id=\"relay_02\" onclick=\"handleClick(this);\" ");
if (val2 == 0) {
client.print("unchecked");
} else {
client.print("checked");
}
client.println("><label for=\"relay_02\" onclick=\"relay_02();\">Relai 2</label></div></form>");
client.println("<form><div><input type=\"checkbox\" id=\"relay_03\" onclick=\"handleClick(this);\" ");
if (val3 == 0) {
client.print("unchecked");
} else {
client.print("checked");
}
client.println("><label for=\"relay_03\" onclick=\"relay_03();\">Relai 3</label></div></form>");
client.println("<form><div><input type=\"checkbox\" id=\"relay_04\" onclick=\"handleClick(this);\" ");
if (val4 == 0) {
client.print("unchecked");
} else {
client.print("checked");
}
client.println("><label for=\"relay_04\" onclick=\"relay_04();\">Relai 4</label></div></form>");
} else if (page == PAGE_ADMIN) {
client.println( "<form action='/ident' method='get'>");
client.println( "<script type='text/javascript'>\nfunction showValue(newValue)\n{\ndocument.getElementById('text').innerHTML=newValue;\n}\n</script>");
client.println( "<div>");
client.println( "<label for='name'>SSID:</label>");
String ssid = String(domoticz->_ssid);
// sprintf (domoticz->_ssid, "%18x", ssid);
client.println( "<input type='text' id='name' name='name' value='" + ssid + "'/>");
client.println( "</div>");
client.println( "<div>");
client.println( "<label for='pass'>Password:</label>");
String pass = String(domoticz->_pass);
client.println( "<input type='password' id='pass' name='pass' value='" + pass + "'/>");
client.println( "</div>");
client.println( "<div>");
client.println( "<label for='domo'>Domoticz:</label>");
client.println( "<input type='text' id='domo' name='domo' value='" + domoticz->_domoticz + "'/>"); // />");
client.println( "</div>");
client.println( "<div>");
client.println( "<label for='port'>Port:</label>");
client.println( "<input type='text' id='port' name='port' value='" + domoticz->_port + "'/>");
client.println( "</div>");
// client.println( "<div>");
// client.println( "<label for='radi'>Id Radiateur:</label>");
// client.println( "<input type='radi' id='radi' name='radi' value='" + radiateur + "'/>");
// client.println( "</div>");
// client.println( "<div>");
// client.println( "<label for='temp'>Id Thermometre:</label>");
// client.println( "<input type='temp' id='temp' name='temp' value='" + temp + "'/>");
// client.println( "</div>");
// client.println( "<div>");
// client.println( "<label for='cons'>Id Consigne:</label>");
// client.println( "<input type='cons' id='cons' name='cons' value='" + cons + "'/>");
// client.println( "</div>");
client.println( "<div class='button'>");
client.println( "<button name=H type='submit'>Ok</button>");
client.println( "</div>");
client.println( "</form>");
} else if (page == PAGE_STATUS) {
client.println("<article>");
printWifiStatus();
client.println("</article>");
} else if (page == PAGE_GRAPH) {
graph();
} else if (page == PAGE_INFOS) {
infos();
}
client.println(" </div>");
client.println("</main>");
client.println("<script>");
client.println("var show_menu=document.querySelector('.show_menu_btn'),viewport_width=document.documentElement.clientWidth,menu=document.querySelector('#nav ul');600>viewport_width&&(menu.style.display='none'),window.addEventListener('resize',function(){var e=document.documentElement.clientWidth;menu.style.display=e>599?'block':'none'}),show_menu.addEventListener('click',function(){var e=document.querySelector(show_menu.getAttribute('data-target'));'none'==e.style.display?(e.style.display='block',show_menu.innerHTML=show_menu.getAttribute('data-shown-text')):(e.style.display='none',show_menu.innerHTML=show_menu.getAttribute('data-hidden-text'))});");
//menuJS();
// Fonction pour les voutons
//client.println("function click(){$(function() {$( '#dialog' ).dialog({width : 250, height: 180, modal : true }); }); }");
client.println("</script>");
if (page == PAGE_GRAPH) {
// client.println("<script src=\"http://" + domoticz->_domoticz + "/" + jsPath + "/" + chartName + "\"></script>");
client.println("<script src=\"https://www.chartjs.org/dist/2.9.3/Chart.min.js\"></script>");
}
else if (page == PAGE_MENU) {
client.println("<script>");
client.println("function relay_04() {document.getElementById(\"relay_04\").click();}");
client.println("function relay_03() {document.getElementById(\"relay_03\").click();}");
client.println("function relay_02() {document.getElementById(\"relay_02\").click();}");
client.println("function relay_01() {document.getElementById(\"relay_01\").click();}");
client.println("function handleClick(cb) {post_to_url(cb, \"/action\", { submit: \"submit\" });}");
client.println("function post_to_url(x, path, params, method) {");
client.println("method = \"get\"; var form = document.createElement(\"form\");");
//1client.println("var x = document.getElementById(\"relay_01\");");
// client.println("var x2 = document.getElementById(\"relay_02\");");
client.println("form._submit_function_ = form.submit;");
client.println("form.setAttribute(\"method\", method);");
client.println("form.setAttribute(\"action\", path);");
client.println("var hiddenField = document.createElement(\"input\");");
client.println("hiddenField.setAttribute(\"type\", \"hidden\");");
client.println("hiddenField.setAttribute(\"name\", x.id);");
client.println("hiddenField.setAttribute(\"value\", x.checked);");
client.println("form.appendChild(hiddenField);");
client.println("document.body.appendChild(form);");
// client.println("var hiddenField2 = document.createElement(\"input\");");
// client.println("hiddenField2.setAttribute(\"type\", \"hidden\");");
// client.println("hiddenField2.setAttribute(\"name\", x2.id);");
// client.println("hiddenField2.setAttribute(\"value\", x2.checked);");
// client.println("form.appendChild(hiddenField2);");
// client.println("document.body.appendChild(form);");
client.println("form._submit_function_(); }</script>");
}
client.println("</body>");
}
void ServeurWeb::menuStyle(int page) {
// menuStyle.css
client.println("<style>");
client.println( "a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,");
client.println( "figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,");
client.println( "strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}");
client.println( "article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:");
client.println( "after,blockquote:before,q:after,q:before{content:'';");
client.println( "content:none}table{border-collapse:collapse;border-spacing:0}h1{font-size:1.5em;font-weight:700;padding:.5em 0;letter-spacing:1px}@media screen and ");
client.println( "(max-width:599px){h1{text-align:center}}h2{font-size:1.25em;font-weight:700;line-height:1.2;padding:.5em 0}p{font-size:1em;padding:0 0 1em}a{color:#555;");
client.println( "text-decoration:none;border-bottom:1px solid #555}a:hover{color:#88b47f;border-bottom:1px solid #88b47f}*{-moz-box-sizing:border-box;-webkit-box-sizing:");
client.println( "border-box;box-sizing:border-box;-webkit-text-size-adjust:auto}body{font-family:sans-serif;font-size:100%;text-align:center;line-height:1.5;background:");
client.println( "#f8f7f0;color:#555}.wrapper{width:90%;max-width:50em;margin:0 auto;text-align:left;overflow:hidden}");
client.println( "header{margin-bottom:1em;padding-bottom:1em;background:#57575f;color:#fff}@media screen and (max-width:599px){.no-js .show_menu_btn{display:none}.js .show_menu_btn,.no-js #nav ul{display:block}.js #nav ul{display:none}}@media screen and (min-width:600px){.show_menu_btn{display:none}#nav ul{display:block}}.show_menu_btn{width:35%;margin:0 auto;padding:.3em;cursor:pointer;text-align:center;background:#88b47f}#nav ul{margin:1em 0}#nav ul li{padding:.5em}#nav ul li:hover{background:#88b47f}#nav ul a{display:block;font-size:1em;color:#eee;border-bottom:none}@media screen and (max-width:599px){#nav ul{display:block}#nav ul li{display:block;text-align:center;border-bottom:1px solid #6f6f7a}}@media screen and (min-width:600px){#nav{overflow:hidden}#nav ul li{width:7em;float:left;margin-right:1em}}");
//Bouton
client.println( ".boutonTemp {width:85px;height:85px;background:#fafafa;box-shadow:2px 2px 8px #aaa;font:bold 13px Arial;border-radius:50%;color:#555;}");
client.println( ".boutonCons {width:85px;height:85px;background:#cc0000;font:bold 13px Arial;border-radius:50%;border:none;color:#fff;}");
// PAGE MENU
client.println("input[type=\"checkbox\"] {display: none;}");
client.println("input[type=\"checkbox\"] + label {display:inline-block; line-height:normal; cursor:pointer; padding: 3px 14px;");
client.println("background-color: #EFEFEF;border-radius: 4px;border: 1px solid #D0D0D0;margin: 40px 100px 10px 40px;");
client.println("}input[type=\"checkbox\"] + label:hover {border-color: #000;background-color: #911;color: #fff;}");
client.println("input[type=\"checkbox\"]:checked + label {border-color: #000;background-color: #888;color: #fff;}");
client.println("</style>");
}
///////////////////////////////////////////////////
// PAGE ADMIN
///////////////////////////////////////////////////
void ServeurWeb::pageAdmin() {
client.println("<html>");
style();
body();
client.println("</html>\n\r");
}
void ServeurWeb::body() {
// body.html
client.println( "<body>");
client.println( "<form action='/ident' method='get'>");
client.println( "<script type='text/javascript'>\nfunction showValue(newValue)\n{\ndocument.getElementById('text').innerHTML=newValue;\n}\n</script>");
client.println( "<div>");
client.println( "<label for='name'>SSID:</label>");
client.println( "<input type='text' id='name' name='name' />");
client.println( "</div>");
client.println( "<div>");
client.println( " <label for='pass'>Password:</label>");
client.println( " <input type='password' id='pass' name='pass' />");
client.println( "</div>");
client.println( "<div>");
client.println( " <label for='domo'>Domoticz:</label>");
client.println( " <input type='text' id='domo' name='domo' />");
client.println( " <label for='port'>Port:</label>");
client.println( " <input type='text' id='port' name='port' />");
client.println( "</div>");
client.println( "<div>");
client.println( " <label for='radi'>Id Radiateur:</label>");
client.println( " <input type='radi' id='radi' name='radi' />");
client.println( "</div>");
client.println( "<div class='button'>");
client.println( " <button name=H type='submit'>Ok</button>");
client.println( "</div>");
client.println( "</form>");
client.println( "</body>");
}
void ServeurWeb::style() {
// style.css
client.println( "<style>");
client.println( "form {");
// client.println( " /* Just to center the form on the page */");
client.println( " margin: 0 auto;");
client.println( " width: 400px;");
client.println( "");
// client.println( " /* To see the limits of the form */");
client.println( " padding: 1em;");
client.println( " border: 1px solid #CCC;");
client.println( " border-radius: 1em;");
client.println( "}");
client.println( "");
client.println( "div + div {");
client.println( " margin-top: 1em;");
client.println( "}");
client.println( "");
client.println( "label {");
// client.println( " /* To make sure that all label have the same size and are properly align */");
client.println( " display: inline-block;");
client.println( " width: 90px;");
client.println( " text-align: right;");
client.println( "}");
client.println( "");
client.println( "input, textarea {");
// client.println( " /* To make sure that all text field have the same font settings");
// client.println( " By default, textarea are set with a monospace font */");
client.println( " font: 1em sans-serif;");
client.println( "");
// client.println( " /* To give the same size to all text field */");
client.println( " width: 300px;");
client.println( "");
client.println( " -moz-box-sizing: border-box;");
client.println( " box-sizing: border-box;");
client.println( "");
// client.println( " /* To harmonize the look & feel of text field border */");
client.println( " border: 1px solid #999;");
client.println( "}");
client.println( "");
client.println( "input:focus, textarea:focus {");
// client.println( " /* To give a little highligh on active elements */");
client.println( " border-color: #000;");
client.println( "}");
client.println( "");
client.println( "textarea {");
// client.println( " /* To properly align multiline text field with their label */");
client.println( " vertical-align: top;");
client.println( "");
// client.println( " /* To give enough room to type some text */");
client.println( " height: 5em;");
client.println( "");
// client.println( " /* To allow users to resize any textarea vertically");
// client.println( " It works only on Chrome, Firefox and Safari */");
client.println( " resize: vertical;");
client.println( "}");
client.println( "");
client.println( ".button {");
// client.println( " /* To position the buttons to the same position of the text fields */");
// client.println( " padding-left: 90px; /* same size as the label elements */");
client.println( "}");
client.println( "");
client.println( "button {");
// client.println( " /* This extra magin represent the same space as the space between");
// client.println( " the labels and their text fields */");
client.println( " margin-left: .5em;");
client.println( "}");
client.println(".toggle-slide {");
client.println(" overflow: hidden;");
client.println(" cursor: pointer;");
client.println(" -webkit-touch-callout: none;");
client.println(" -webkit-user-select: none;");
client.println(" -khtml-user-select: none;");
client.println(" -moz-user-select: none;");
client.println(" -ms-user-select: none;");
client.println(" user-select: none;");
client.println(" direction: ltr;");
client.println("}");
client.println(".toggle-slide .toggle-on,.toggle-slide .toggle-off,.toggle-slide .toggle-blob {");
client.println(" float: left;");
client.println("}");
client.println(".toggle-slide .toggle-blob {");
client.println(" position: relative;");
client.println(" z-index: 99;");
client.println(" cursor: hand;");
client.println(" cursor: grab;");
client.println(" cursor: -moz-grab;");
client.println(" cursor: -webkit-grab;");
client.println("}");
client.println( "</style>");
}
void ServeurWeb::graph() {
// infos();
client.println( "<canvas id='canvas' ></canvas>");
client.println( "<script>");
client.println( "var randomScalingFactor = function(){ return Math.round(Math.random()*100)};");
client.println( "var config = {");
client.println( "type: 'line',");
client.println( " data: {");
client.print( "labels : ["); //\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\"],");
client.print(domoticz->labels);
client.println("],");
client.println( "datasets : [");
client.println( "{");
client.println( "label: \"My First dataset\",");
client.println( " fillColor : \"rgba(220,220,220,0.2)\",");
client.println( " strokeColor : \"rgba(220,220,220,1)\",");
client.println( " pointColor : \"rgba(220,220,220,1)\",");
client.println( " pointStrokeColor : \"#fff\",");
client.println( " pointHighlightFill : \"#fff\",");
client.println( " pointHighlightStroke : \"rgba(220,220,220,1)\",");
client.print( " data : [");
// randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()
client.print(domoticz->data);
client.print("]}");
client.println( " ]}};");
client.println( "window.onload = function(){");
client.println( " var ctx = document.getElementById(\"canvas\").getContext(\"2d\");");
client.println( " window.myLine = new Chart(ctx, config);");
// client.println( " responsive: true, animation:true});");
client.println( "}");
client.println( "</script>");
}
//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]) : "";
//}
void ServeurWeb::ident(String req) {
// Return : ident?name=jjjjj&pass=kkkk&domo&H=
int posName = req.indexOf("name");
int posPass = req.indexOf("pass", posName);
int posDomo = req.indexOf("domo", posPass);
int posPort = req.indexOf("port", posDomo);
// int posRadi = req.indexOf("radi", posPort);
// int posTemp = req.indexOf("temp", posRadi);
// int posCons = req.indexOf("cons", posTemp);
// int End = req.indexOf("H", posCons);
//if (End < 0) {
int End = req.length() + 1;
//}
//ssid
String ssid = getValueFrom(req, posName, posPass);
char ssidc[ssid.length() + 1];
ssid.toCharArray(ssidc, ssid.length() + 1);
//Password
String pass = getValueFrom(req, posPass, posDomo);
char passc[pass.length() + 1];
pass.toCharArray(passc, pass.length() + 1);
// Domo
String domo = getValueFrom(req, posDomo, posPort);
char domoc[domo.length() + 1];
domo.toCharArray(domoc, domo.length() + 1);
// Port
String port = getValueFrom(req, posPort, End); //posRadi);
char portc[port.length() + 1];
port.toCharArray(portc, port.length() + 1);
// // Radiateur
// String radi = getValueFrom(req, posRadi, posTemp);
// char radic[radi.length() + 1];
// radi.toCharArray(radic, radi.length() + 1);
// // Thermometre
// String temp = getValueFrom(req, posTemp, posCons);
// char tempc[temp.length() + 1];
// temp.toCharArray(tempc, temp.length() + 1);
// // Consigne
// String cons = getValueFrom(req, posCons, End);
// char consc[cons.length() + 1];
// cons.toCharArray(consc, cons.length() + 1);
Serial.println("SSID=" + ssid);
Serial.println("Pass=" + pass);
Serial.println("Domo=" + domo);
Serial.println("Port=" + port);
eeprom->writeString(0, ssid);
eeprom->writeString(20, pass);
eeprom->writeString(40, domo);
eeprom->writeString(60, port);
Serial.println("SSID=" + eeprom->readString(0));
Serial.println("Pass=" + eeprom->readString(20));
Serial.println("Domo=" + eeprom->readString(40));
Serial.println("Port=" + eeprom->readString(60));
// Serial.println("Radi=" + radi);
// Serial.println("Temp=" + temp);
// Serial.println("Cons=" + cons);
//Domoticz domo("192.168.1.3", "81", "Livebox-37cc", "8A6060920A8A86896F770F2C47");
// boolean connected = connectToWifi(ssidc, passc);
// client.flush();
// // Prepare the response. Start with the common header:
String s = "HTTP/1.1 200 OK\r\n";
s += "Content-Type: text/html\r\n\r\n";
s += "<!DOCTYPE HTML>\r\n<html>\r\n";
//s += "Connexion en-cours.";
if (true) {
s += "WiFi connected\n";
// Start the server
// server.begin();
// s+="Server started\n";
// Print the IP address
s += "Use this URL to connect: ";
s += "http://";
//s += WiFi.localIP();
s += "/_n";
} else {
s += "Connexion impossible";
}
s += "</html>\n";
client.println(s);
delay(200);
}

View File

@@ -0,0 +1,84 @@
#ifndef ServeurWeb_h
#define ServeurWeb_h
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "Domoticz.h"
#include "Eeprom.h"
#include "Params.h"
#include "Modules.h"
#include "Pins.h"
#define PAGE_MENU 0
#define PAGE_ADMIN 1
#define PAGE_STATUS 2
#define PAGE_INFOS 3
#define PAGE_GRAPH 4
#define DELAI_LECTURE 120
class ServeurWeb
{
public:
ServeurWeb();
//void setup();
void loop();
private:
boolean connectToWifi();
//void initHardware();
char* convertToChar(String s, char* buf);
void infos();
void menuBody(int page);
void pageAdmin();
void pageMenu(int page);
void printWifiStatus();
//void setupWiFi();
void body();
String getValueFrom(String request, int deb, int fin);
void menuStyle(int page);
void style();
void graph();
void ident(String req);
public:
Domoticz* domoticz;
Modules* modules;
// WiFiClient _client;
String radiateur = ""; //"217";
String temp = ""; //"281";
String cons = ""; //"212";
String jsPath = "/ESP8266/js/";
String jqueryName = "jquery.js";
String chartName = "chart.js";
String AP_NameString = "";
int nbData = 0;
String data = "22.3,22.3,22.3,22.3";
String labels = "0,1,2,3";
int bcl = 0;
int val0;
int val2;
int val3;
int val4;
String separator = ",";
String nom = "";
int refresh = 2;
WiFiClient client;
WiFiServer* server;
Eeprom * eeprom;
};
#endif
// // Ordre dans Domoticz
// // Radiateur Temp Consigne
// //Manon 217 281 212
// //Théo 219 335 211
// //Chambre 218 254 213
// //Bureau 163 260 214

View File

@@ -0,0 +1 @@
TOTO

View File

@@ -0,0 +1,27 @@
<body>
<form action='/ident' method='get'>
<script type='text/javascript'>\nfunction showValue(newValue)\n{\ndocument.getElementById('text').innerHTML=newValue;\n}\n</script>
<div>
<label for='name'>SSID:</label>
<input type='text' id='name' name='name' />
</div>
<div>
<label for='pass'>Password:</label>
<input type='password' id='pass' name='pass' />
</div>
<div>
<label for='domo'>Domoticz:</label>
<input type='text' id='domo' name='domo' />
<label for='port'>Port:</label>
<input type='text' id='port' name='port' />
</div>
<div>
<label for='radi'>Id Radiateur:</label>
<input type='radi' id='radi' name='radi' />
</div>
<div class='button'>
<button name=H type='submit'>Ok</button>
</div>
</form>
</body>

View File

@@ -0,0 +1,23 @@
<style>
a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,
figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,
strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}
article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:
after,blockquote:before,q:after,q:before{content:'';
content:none}table{border-collapse:collapse;border-spacing:0}h1{font-size:1.5em;font-weight:700;padding:.5em 0;letter-spacing:1px}@media screen and
(max-width:599px){h1{text-align:center}}h2{font-size:1.25em;font-weight:700;line-height:1.2;padding:.5em 0}p{font-size:1em;padding:0 0 1em}a{color:#555;
text-decoration:none;border-bottom:1px solid #555}a:hover{color:#88b47f;border-bottom:1px solid #88b47f}*{-moz-box-sizing:border-box;-webkit-box-sizing:
border-box;box-sizing:border-box;-webkit-text-size-adjust:auto}body{font-family:sans-serif;font-size:100%;text-align:center;line-height:1.5;background:
#f8f7f0;color:#555}.wrapper{width:90%;max-width:50em;margin:0 auto;text-align:left;overflow:hidden}
header{margin-bottom:1em;padding-bottom:1em;background:#57575f;color:#fff}@media screen and (max-width:599px){.no-js .show_menu_btn{display:none}.js .show_menu_btn,.no-js #nav ul{display:block}.js #nav ul{display:none}}@media screen and (min-width:600px){.show_menu_btn{display:none}#nav ul{display:block}}.show_menu_btn{width:35%;margin:0 auto;padding:.3em;cursor:pointer;text-align:center;background:#88b47f}#nav ul{margin:1em 0}#nav ul li{padding:.5em}#nav ul li:hover{background:#88b47f}#nav ul a{display:block;font-size:1em;color:#eee;border-bottom:none}@media screen and (max-width:599px){#nav ul{display:block}#nav ul li{display:block;text-align:center;border-bottom:1px solid #6f6f7a}}@media screen and (min-width:600px){#nav{overflow:hidden}#nav ul li{width:7em;float:left;margin-right:1em}}
.boutonTemp {width:85px;height:85px;background:#fafafa;box-shadow:2px 2px 8px #aaa;font:bold 13px Arial;border-radius:50%;color:#555;}
.boutonCons {width:85px;height:85px;background:#cc0000;font:bold 13px Arial;border-radius:50%;border:none;color:#fff;}
input[type="checkbox"] {display: none;}
input[type="checkbox"] + label {display:inline-block; line-height:normal; cursor:pointer; padding: 3px 14px;
background-color: #EFEFEF;border-radius: 4px;border: 1px solid #D0D0D0;margin: 40px 100px 10px 40px;
}input[type="checkbox"] + label:hover {border-color: #000;background-color: #911;color: #fff;}
input[type="checkbox"]:checked + label {border-color: #000;background-color: #888;color: #fff;}
</style>

View File

@@ -0,0 +1,91 @@
<style>
form {
/* Just to center the form on the page */
margin: 0 auto;
width: 400px;
/* To see the limits of the form */
padding: 1em;
border: 1px solid #CCC;
border-radius: 1em;
}
div + div {
margin-top: 1em;
}
label {
/* To make sure that all label have the same size and are properly align */
display: inline-block;
width: 90px;
text-align: right;
}
input, textarea {
/* To make sure that all text field have the same font settings
By default, textarea are set with a monospace font */
font: 1em sans-serif;
/* To give the same size to all text field */
width: 300px;
-moz-box-sizing: border-box;
box-sizing: border-box;
/* To harmonize the look & feel of text field border */
border: 1px solid #999;
}
input:focus, textarea:focus {
/* To give a little highligh on active elements */
border-color: #000;
}
textarea {
/* To properly align multiline text field with their label */
vertical-align: top;
/* To give enough room to type some text */
height: 5em;
/* To allow users to resize any textarea vertically
It works only on Chrome, Firefox and Safari */
resize: vertical;
}
.button {
/* To position the buttons to the same position of the text fields */
padding-left: 90px; /* same size as the label elements */
}
button {
/* This extra magin represent the same space as the space between
the labels and their text fields */
margin-left: .5em;
}
.toggle-slide {
overflow: hidden;
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
direction: ltr;
}
.toggle-slide .toggle-on,.toggle-slide .toggle-off,.toggle-slide .toggle-blob {
float: left;
}
.toggle-slide .toggle-blob {
position: relative;
z-index: 99;
cursor: hand;
cursor: grab;
cursor: -moz-grab;
cursor: -webkit-grab;
}
</style>

Binary file not shown.