It looks like the network problem was caused by a lengthy ISR routine so I’ve removed my previous post. Today’s lesson -The serial buffer doesn’t need an interrupt and holds 64 bytes which is more than enough for the data 
/**
Used togheter with RF433_Slave.ino
2017-10-25 21:56:45 - Removed parse data routine to a timer instead of ISR to keep it shorter. The time spent in ISR
sometimes collided with ethernet ACK's from the Blynk server and then freezing the board. Lessons learned!
2017-10-25 22:42:32 - Removed ISR altogether! The serial buffer holds 64 bytes and doesn't need an interrupt :) Using timer instead.
**/
#define BLYNK_PRINT Serial
#include <NexaSelfLearningTransmitter.h>
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
const byte W5100_CS = 10;
const byte SDCARD_CS = 4;
//============ MASTER <- -> SLAVE
const byte signalPin = 9; // To: SLAVE pin 12. Set to HIGH when transmitting
//============ Temp sensor
const byte ONE_WIRE_BUS = 3;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
//============ Transmitter
uint8_t TX_PIN = 8;
uint8_t TX_LED = 7; // Not connected, but need to be defined (and W5100 uses 13).
NexaSelfLearningTransmitter transmitter = NexaSelfLearningTransmitter(TX_PIN, TX_LED);
bool on = false;
bool group = false;
short dim = 0;
uint8_t channel = 0;
uint64_t receivedSignal = 0;
uint32_t TRANSMITTER_ID = 1912830;
//============ Parsed data
const byte numChars = 26; // Needs to hold something like this <1912830,1,14,0,-1>
char receivedChars[numChars];
char tempChars[numChars];
long int pTransmitter;
int pOn;
int pGroup;
int pChannel;
int pDim;
bool newData = false;
//============ Blynkkk stuff
WidgetTerminal terminal(V4);
BlynkTimer timer;
WidgetRTC rtc;
char currentTime[9];
bool clockSync = false;
char auth[] = "";
byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xCC };
IPAddress arduino_ip (192, 168, 0, 20);
IPAddress dns_ip (192, 168, 0, 1);
IPAddress gateway_ip (192, 168, 0, 1);
IPAddress subnet_mask(255, 255, 255, 0);
//============ Setup
void setup() {
pinMode(signalPin, OUTPUT);
digitalWrite(signalPin, LOW); // HIGH when sending
pinMode(SDCARD_CS, OUTPUT);
digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
Serial.begin(115200);
Serial.println();
DS18B20.begin();
Blynk.begin(auth, "cloud.blynk.cc", 8442, arduino_ip, dns_ip, gateway_ip, subnet_mask, arduino_mac);
while (Blynk.connect() == false) {
// Wait until connected
}
for (int i = 0; i <= 24; i++) {
terminal.println(""); // "clear screen" in app.
}
terminal.flush();
terminal.println(F("Blynk v" BLYNK_VERSION ": Device started"));
terminal.println(F("-------------"));
terminal.flush();
timer.setInterval(60000L, activetoday); // check every 60s if ON / OFF trigger time has been reached
timer.setInterval(30000L, reconnectBlynk); // check every 30s if still connected to server
timer.setInterval(5000L, clockDisplay); // check every 5 second if time has been obtained from the server
timer.setInterval(60000L, getSensorData); // get temp sensor every 60s
timer.setInterval(1000L, readSerialBuffer); // check for new data in buffer every second
}
void timeStamp() {
clockSync = false;
clockDisplay();
}
BLYNK_CONNECTED() {
rtc.begin();
}
void activetoday(){ // check if schedule should run today
if(year() != 1970){
Blynk.syncVirtual(V10); // sync scheduler #1
}
}
void clockDisplay(){ // only needs to be done once after time sync
if((year() != 1970) && (clockSync == false)){
sprintf(currentTime, "%02d:%02d:%02d", hour(), minute(), second());
Serial.println(currentTime);
terminal.println(currentTime);
terminal.flush();
clockSync = true;
}
}
BLYNK_WRITE(V10) { // Scheduler #1 Time Input widget
TimeInputParam t(param);
unsigned int nowseconds = ((hour() * 3600) + (minute() * 60) + second());
unsigned int startseconds = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
unsigned int stopseconds = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);
int dayadjustment = -1;
if(weekday() == 1){
dayadjustment = 6; // needed for Sunday Time library is day 1 and Blynk is day 7
}
if(t.isWeekdaySelected((weekday() + dayadjustment))){ //Time library starts week on Sunday, Blynk on Monday
//Schedule is ACTIVE today
if(nowseconds >= startseconds - 31 && nowseconds <= startseconds + 31 ){ // 62s on 60s timer ensures 1 trigger command is sent
digitalWrite(signalPin, HIGH); // Tells SLAVE to ignore transmission
transmitter.deviceOn(TRANSMITTER_ID, 15); // Doesnt always work for some reason
Blynk.virtualWrite(V0, 1); // This however always work as long as it's connected to internet
Blynk.syncVirtual(V0);
Serial.println("Schedule 1 started");
terminal.println("Schedule 1 started");
terminal.flush();
timeStamp();
digitalWrite(signalPin, LOW); // OK for SLAVE to receive again
}
if(nowseconds >= stopseconds - 31 && nowseconds <= stopseconds + 31 ){ // 62s on 60s timer ensures 1 trigger command is sent
digitalWrite(signalPin, HIGH);
transmitter.deviceOff(TRANSMITTER_ID, 15);
Blynk.virtualWrite(V0, 0);
Blynk.syncVirtual(V0);
Serial.println("Schedule 1 finished");
terminal.println("Schedule 1 finished");
terminal.flush();
timeStamp();
digitalWrite(signalPin, LOW);
}
}
}
BLYNK_WRITE(V0) { // Unit (plug) 1
digitalWrite(signalPin, HIGH); // Tells SLAVE to ignore transmission
if ( param.asInt() == 1 ) {
transmitter.deviceOn(TRANSMITTER_ID, 15);
Serial.println("RC 1 ON");
terminal.println("RC 1 ON");
terminal.flush();
}
else {
transmitter.deviceOff(TRANSMITTER_ID, 15);
Serial.println("RC 1 OFF");
terminal.println("RC 1 OFF");
terminal.flush();
}
digitalWrite(signalPin, LOW); // OK for SLAVE to receive again
}
BLYNK_WRITE(V1) { // Unit 2
digitalWrite(signalPin, HIGH);
if ( param.asInt() == 1 ) {
transmitter.deviceOn(TRANSMITTER_ID, 14);
Serial.println("RC 2 ON");
terminal.println("RC 2 ON");
terminal.flush();
}
else {
transmitter.deviceOff(TRANSMITTER_ID, 14);
Serial.println("RC 2 OFF");
terminal.println("RC 2 OFF");
terminal.flush();
}
digitalWrite(signalPin, LOW);
}
BLYNK_WRITE(V2) { // Unit 3
digitalWrite(signalPin, HIGH);
if ( param.asInt() == 1 ) {
transmitter.deviceOn(TRANSMITTER_ID, 13);
Serial.println("RC 3 ON");
terminal.println("RC 3 ON");
terminal.flush();
}
else {
transmitter.deviceOff(TRANSMITTER_ID, 13);
Serial.println("RC 3 OFF");
terminal.println("RC 3 OFF");
terminal.flush();
}
digitalWrite(signalPin, LOW);
}
BLYNK_WRITE(V3) { // Group, all units
digitalWrite(signalPin, HIGH);
if ( param.asInt() == 1 ) {
transmitter.groupOn(TRANSMITTER_ID);
Blynk.virtualWrite(V0, 1);
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V2, 1);
Serial.println("ALL IS ON");
terminal.println("ALL IS ON");
terminal.flush();
}
else {
transmitter.groupOff(TRANSMITTER_ID);
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
Serial.println("ALL IS OFF");
terminal.println("ALL IS OFF");
terminal.flush();
}
digitalWrite(signalPin, LOW);
}
void reconnectBlynk() {
if (!Blynk.connected()) {
Serial.println("Lost connection");
if(Blynk.connect()) {
Serial.println("Reconnected");
}
else {
Serial.println("Not reconnected");
}
}
}
//============ Temperature sensor
void getSensorData() {
DS18B20.requestTemperatures();
float temp = DS18B20.getTempCByIndex(0);
float roundedValue = ceilf(temp * 100) / 100; // well...
Serial.println(roundedValue);
Blynk.virtualWrite(5, roundedValue);
}
//============ Check serial buffer and parse data
void readSerialBuffer() {
if (newData == false) {
recvWithStartEndMarkers();
}
if (newData == true) {
strcpy(tempChars, receivedChars);
parseData();
//showParsedData(); // Debug only
newData = false;
}
}
//============ Read the serial buffer
void recvWithStartEndMarkers() {
static bool recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
//============
void parseData() { // split the data into its parts. Looks something like this <1912830,1,15,0,-1>
char * strtokIndx; // this is used by strtok() as an index
strtokIndx = strtok(tempChars,","); // The string
pTransmitter = atol(strtokIndx); // Transmitter ID
strtokIndx = strtok(NULL, ",");
pOn = atoi(strtokIndx); // ON or OFF (1 or 0)
strtokIndx = strtok(NULL, ",");
pChannel = atoi(strtokIndx); // Devcie number (13, 14, 15)
strtokIndx = strtok(NULL, ",");
pGroup = atoi(strtokIndx); // Group ON or OFF (1 or 0)
strtokIndx = strtok(NULL, ",");
pDim = atoi(strtokIndx); // Dim values
if (pChannel == 15 && pGroup == 0){ // Unit 1, NOTICE: Group also has 15
Blynk.virtualWrite(V0, pOn);
Blynk.syncVirtual(V0);
}
else if (pChannel == 14) { // Unit 2
Blynk.virtualWrite(V1, pOn);
Blynk.syncVirtual(V1);
}
else if (pChannel == 13) { // Unit 3
Blynk.virtualWrite(V2, pOn);
Blynk.syncVirtual(V2);
}
else if (pChannel == 15 && pGroup == 1) { // Group
Blynk.virtualWrite(V3, pOn);
Blynk.syncVirtual(V3);
}
}
//============ Main LOOP
void loop() {
if(Blynk.connected()) {
Blynk.run();
}
timer.run();
}
Again, thanks to @Costas, @PeteKnight and @Gunner and others for taking interest in my project! 