Untitled diff

Created Diff never expires
74 removals
217 lines
72 additions
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!
const char *pass = "MyVerySecretPassword"; //


// Use this if you have attached a Ethernet ENC28J60 shields
#define INCLUSION_MODE_TIME 1 // Number of minutes inclusion mode is enabled
// #include <UIPEthernet.h>
// #define INCLUSION_MODE_PIN 3 // Digital pin used for inclusion mode button


// Use this for WizNET W5100 module and Arduino Ethernet Shield
#define RADIO_CE_PIN 4 // radio chip enable
#include <Ethernet.h>
#define RADIO_SPI_SS_PIN 15 // radio SPI serial select


#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 RADIO_CE_PIN 5 // radio chip enable
#define RADIO_SPI_SS_PIN 6 // 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;
}
}
}
}
}
}
}
}