Untitled diff

Created Diff never expires
65 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
217 lines
67 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
217 lines
/**
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
* network topology allowing messages to be routed to nodes.
*
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
*
* Documentation: http://www.mysensors.org
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
* Support Forum: http://forum.mysensors.org
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
* version 2 as published by the Free Software Foundation.
*
*
*******************************
*******************************
*
*
* REVISION HISTORY
* REVISION HISTORY
* Version 1.0 - Henrik EKblad
* Version 1.0 - Henrik EKblad
* Contribution by a-lurker and Anticimex,
* Contribution by a-lurker and Anticimex,
* Contribution by Norbert Truchsess <norbert.truchsess@t-online.de>
* Contribution by Norbert Truchsess <norbert.truchsess@t-online.de>
*
* Contribution by Ivo Pullens (ESP8266 support)
*
*
* DESCRIPTION
* DESCRIPTION
* The EthernetGateway sends data received from sensors to the ethernet link.
* The EthernetGateway sends data received from sensors to the WiFi link.
* The gateway also accepts input on ethernet interface, which is then sent out to the radio network.
* The gateway also accepts input on ethernet interface, which is then sent out to the radio network.
*
*
* The GW code is designed for Arduino 328p / 16MHz. ATmega168 does not have enough memory to run this program.
*
*
* COMPILING WIZNET (W5100) ETHERNET MODULE
* > Edit MyConfig.h in (libraries\MySensors\) to enable softspi (remove // before "#define SOFTSPI").
*
* COMPILING ENC28J60 ETHERNET MODULE
* > Use Arduino IDE 1.5.7 (or later)
* > Disable DEBUG in Sensor.h before compiling this sketch. Othervise the sketch will probably not fit in program space when downloading.
* > Remove Ethernet.h include below and include UIPEthernet.h
* > Remove DigitalIO include
* Note that I had to disable UDP and DHCP support in uipethernet-conf.h to reduce space. (which means you have to choose a static IP for that module)
*
* VERA CONFIGURATION:
* VERA CONFIGURATION:
* Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin.
* Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin.
* E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003
* E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003
*
*
* LED purposes:
* LED purposes:
* - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h
* - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error
* - ERR (red) - fast blink on error during transmission error or recieve crc error
*
*
* See http://www.mysensors.org/build/ethernet_gateway for wiring instructions.
* See http://www.mysensors.org/build/ethernet_gateway for wiring instructions.
* The ESP8266 however requires different wiring:
* nRF24L01+ ESP8266
* VCC VCC
* CE GPIO4
* CSN/CS GPIO15
* SCK GPIO14
* MISO GPIO12
* MOSI GPIO13
*
* Not all ESP8266 modules have all pins available on their external interface.
* This code has been tested on an ESP-12 module.
* The ESP8266 requires a certain pin configuration to download code, and another one to run code:
* - Connect REST (reset) via 10K pullup resistor to VCC, and via switch to GND ('reset switch')
* - Connect GPIO15 via 10K pulldown resistor to GND
* - Connect CH_PD via 10K resistor to VCC
* - Connect GPIO2 via 10K resistor to VCC
* - Connect GPIO0 via 10K resistor to VCC, and via switch to GND ('bootload switch')
*
* Signing, RF69 radio, inclusion button and a separate SPI flash are not supported yet!
*
*
* Make sure to fill in your ssid and WiFi password below for ssid & pass.
*/
*/
#define NO_PORTB_PINCHANGES
#define NO_PORTB_PINCHANGES


#include <DigitalIO.h> // This include can be removed when using UIPEthernet module
#include <SPI.h>
#include <SPI.h>


#include <MySigningNone.h>
#include <MyTransportRFM69.h>
#include <MyTransportNRF24.h>
#include <MyTransportNRF24.h>
#include <MyHwATMega328.h>
#include <EEPROM.h>
#include <MySigningAtsha204Soft.h>
#include <MyHwESP8266.h>
#include <MySigningAtsha204.h>
#include <ESP8266WiFi.h>


#include <MyParserSerial.h>
#include <MyParserSerial.h>
#include <MySensor.h>
#include <MySensor.h>
#include <stdarg.h>
#include <stdarg.h>
#include <PinChangeInt.h>
#include "GatewayUtil.h"
#include "GatewayUtil.h"



const char *ssid = "MySSID"; // cannot be longer than 32 characters!
// Use this if you have attached a Ethernet ENC28J60 shields
const char *pass = "MyVerySecretPassword"; //
// #include <UIPEthernet.h>

// Use this for WizNET W5100 module and Arduino Ethernet Shield
#include <Ethernet.h>



#define INCLUSION_MODE_TIME 1 // Number of minutes inclusion mode is enabled
#define INCLUSION_MODE_TIME 1 // Number of minutes inclusion mode is enabled
#define INCLUSION_MODE_PIN 3 // Digital pin used for inclusion mode button
// #define INCLUSION_MODE_PIN 3 // Digital pin used for inclusion mode button


#define RADIO_CE_PIN 5 // radio chip enable
#define RADIO_CE_PIN 4 // radio chip enable
#define RADIO_SPI_SS_PIN 6 // radio SPI serial select
#define RADIO_SPI_SS_PIN 15 // radio SPI serial select


#define RADIO_ERROR_LED_PIN 7 // Error led pin
#define RADIO_ERROR_LED_PIN 7 // Error led pin
#define RADIO_RX_LED_PIN 8 // Receive led pin
#define RADIO_RX_LED_PIN 8 // Receive led pin
#define RADIO_TX_LED_PIN 9 // the PCB, on board LED
#define RADIO_TX_LED_PIN 9 // the PCB, on board LED




// NRFRF24L01 radio driver (set low transmit power by default)
// NRFRF24L01 radio driver (set low transmit power by default)
MyTransportNRF24 transport(RADIO_CE_PIN, RADIO_SPI_SS_PIN, RF24_PA_LEVEL_GW);
MyTransportNRF24 transport(RADIO_CE_PIN, RADIO_SPI_SS_PIN, RF24_PA_LEVEL_GW);
//MyTransportRFM69 transport;

// Message signing driver (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
//MySigningNone signer;
//MySigningAtsha204Soft signer;
//MySigningAtsha204 signer;


// Hardware profile
// Hardware profile
MyHwATMega328 hw;
MyHwESP8266 hw;


// Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
// Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
// To use LEDs blinking, uncomment WITH_LEDS_BLINKING in MyConfig.h
// To use LEDs blinking, uncomment WITH_LEDS_BLINKING in MyConfig.h
#ifdef WITH_LEDS_BLINKING
#ifdef WITH_LEDS_BLINKING
MySensor gw(transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN);
MySensor gw(transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN);
#else
#else
MySensor gw(transport, hw /*, signer*/);
MySensor gw(transport, hw /*, signer*/);
#endif
#endif




#define IP_PORT 5003 // The port you want to open
#define IP_PORT 5003 // The port you want to open
IPAddress myIp (192, 168, 178, 66); // Configure your static ip-address here COMPILE ERROR HERE? Use Arduino IDE 1.5.7 or later!

// The MAC address can be anything you want but should be unique on your network.
// Newer boards have a MAC address printed on the underside of the PCB, which you can (optionally) use.
// Note that most of the Ardunio examples use "DEAD BEEF FEED" for the MAC address.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // DEAD BEEF FEED


// a R/W server on the port
// a R/W server on the port
EthernetServer server = EthernetServer(IP_PORT);
WiFiServer server(IP_PORT);
// handle to open connection
// handle to open connection
EthernetClient client = EthernetClient();
WiFiClient client;


char inputString[MAX_RECEIVE_LENGTH] = ""; // A string to hold incoming commands from serial/ethernet interface
char inputString[MAX_RECEIVE_LENGTH] = ""; // A string to hold incoming commands from serial/ethernet interface
int inputPos = 0;
int inputPos = 0;
bool sentReady = false;
bool sentReady = false;


void output(const char *fmt, ... ) {
void output(const char *fmt, ... ) {
va_list args;
va_list args;
va_start (args, fmt );
va_start (args, fmt );
vsnprintf_P(serialBuffer, MAX_SEND_LENGTH, fmt, args);
vsnprintf_P(serialBuffer, MAX_SEND_LENGTH, fmt, args);
va_end (args);
va_end (args);
Serial.print(serialBuffer);
Serial.print(serialBuffer);
server.write(serialBuffer);
server.write(serialBuffer);
}
}


void setup()
void setup()
{
{
Ethernet.begin(mac, myIp);
// Setup console
Serial.begin(115200);

Serial.println();
Serial.println("ESP8266 MySensors Gateway");
Serial.print("Connecting to "); Serial.println(ssid);


(void)WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected!");
Serial.print("IP: "); Serial.println(WiFi.localIP());
Serial.flush();
#ifndef INCLUSION_MODE_PIN
setupGateway(255, INCLUSION_MODE_TIME, output);
#else
setupGateway(INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output);
setupGateway(INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output);


// Add interrupt for inclusion button to pin
// Add interrupt for inclusion button to pin
PCintPort::attachInterrupt(pinInclusion, startInclusionInterrupt, RISING);
PCintPort::attachInterrupt(pinInclusion, startInclusionInterrupt, RISING);

#endif
// give the Ethernet interface a second to initialize
delay(1000);


// Initialize gateway at maximum PA level, channel 70 and callback for write operations
// Initialize gateway at maximum PA level, channel 70 and callback for write operations
gw.begin(incomingMessage, 0, true, 0);
gw.begin(incomingMessage, 0, true, 0);

// start listening for clients
// start listening for clients
server.begin();
server.begin();

}
}




void loop() {
void loop() {
gw.process();
gw.process();
#ifdef INCLUSION_MODE_PIN
checkButtonTriggeredInclusion();
checkButtonTriggeredInclusion();
checkInclusionFinished();
checkInclusionFinished();
#endif
// if an incoming client connects, there will be
//check if there are any new clients
// bytes available to read via the client object
if (server.hasClient())
EthernetClient newclient = server.available();
{
// if a new client connects make sure to dispose any previous existing sockets
if (client)
if (newclient) {
{
if (client != newclient) {
client.stop();
client.stop();
}
client = newclient;
client = server.available();
output(PSTR("0;0;%d;0;%d;Gateway startup complete.\n"), C_INTERNAL, I_GATEWAY_READY);
output(PSTR("0;0;%d;0;%d;Gateway startup complete.\n"), C_INTERNAL, I_GATEWAY_READY);
}
}
}

if (client) {
if (client) {
if (!client.connected()) {
if (!client.connected()) {
client.stop();
client.stop();
} else if (client.available()) {
} else if (client.available()) {
// read the bytes incoming from the client
// read the bytes incoming from the client
char inChar = client.read();
char inChar = client.read();
if (inputPos<MAX_RECEIVE_LENGTH-1) {
if (inputPos<MAX_RECEIVE_LENGTH-1) {
// if newline then command is complete
// if newline then command is complete
if (inChar == '\n') {
if (inChar == '\n') {
Serial.println("Finished");
Serial.println("Finished");
// a command was issued by the client
// a command was issued by the client
// we will now try to send it to the actuator
// we will now try to send it to the actuator
inputString[inputPos] = 0;
inputString[inputPos] = 0;
// echo the string to the serial port
// echo the string to the serial port
Serial.print(inputString);
Serial.print(inputString);
parseAndSend(gw, inputString);
parseAndSend(gw, inputString);
// clear the string:
// clear the string:
inputPos = 0;
inputPos = 0;
} else {
} else {
// add it to the inputString:
// add it to the inputString:
inputString[inputPos] = inChar;
inputString[inputPos] = inChar;
inputPos++;
inputPos++;
}
}
} else {
} else {
// Incoming message too long. Throw away
// Incoming message too long. Throw away
inputPos = 0;
inputPos = 0;
}
}
}
}
}
}
}
}