-
Notifications
You must be signed in to change notification settings - Fork 317
/
_P108_WOL.ino
133 lines (118 loc) · 4.18 KB
/
_P108_WOL.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//#######################################################################################################
//#################################### Plugin 108: WOL receiver #########################################
//#######################################################################################################
// This plugin receives Wake On Lan (WOL) messages that can be used to power on a connected device.
// Note that the ESP itself has no WOL feature. It must be active to receive this message.
// So you can't wake an ESP from deepsleep using WOL because Wifi is down during deepsleep.
#define PLUGIN_108
#define PLUGIN_ID_108 108
#define PLUGIN_NAME_108 "WOL Receiver"
#define PLUGIN_VALUENAME1_108 "WOL"
WiFiUDP *WOL;
boolean Plugin_108(byte function, struct EventStruct *event, String& string)
{
boolean success = false;
switch (function)
{
case PLUGIN_DEVICE_ADD:
{
Device[++deviceCount].Number = PLUGIN_ID_108;
Device[deviceCount].Type = DEVICE_TYPE_SINGLE;
Device[deviceCount].Custom = true;
Device[deviceCount].TimerOption = false;
break;
}
case PLUGIN_GET_DEVICENAME:
{
string = F(PLUGIN_NAME_108);
break;
}
case PLUGIN_GET_DEVICEVALUENAMES:
{
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_108));
break;
}
case PLUGIN_WEBFORM_LOAD:
{
string += F("<TR><TD>Power control pin:<TD>");
addPinSelect(false, string, "taskdevicepin1", Settings.TaskDevicePin1[event->TaskIndex]);
byte choice = Settings.TaskDevicePluginConfig[event->TaskIndex][0];
String options[2];
options[0] = F("Active Low");
options[1] = F("Active High");
int optionValues[2];
optionValues[0] = 0;
optionValues[1] = 1;
string += F("<TR><TD>Output state:<TD><select name='plugin_108_state'>");
for (byte x = 0; x < 2; x++)
{
string += F("<option value='");
string += optionValues[x];
string += "'";
if (choice == optionValues[x])
string += F(" selected");
string += ">";
string += options[x];
string += F("</option>");
}
string += F("</select>");
success = true;
break;
}
case PLUGIN_WEBFORM_SAVE:
{
String plugin1 = WebServer.arg("plugin_108_state");
Settings.TaskDevicePluginConfig[event->TaskIndex][0] = plugin1.toInt();
success = true;
break;
}
case PLUGIN_INIT:
{
if (!WOL)
{
WOL = new WiFiUDP;
WOL->begin(7);
}
if (Settings.TaskDevicePin1[event->TaskIndex] != -1)
{
pinMode(Settings.TaskDevicePin1[event->TaskIndex], OUTPUT);
digitalWrite(Settings.TaskDevicePin1[event->TaskIndex], !Settings.TaskDevicePluginConfig[event->TaskIndex][0]);
}
}
success = true;
break;
case PLUGIN_ONCE_A_SECOND:
{
int packetSize = WOL->parsePacket();
if (packetSize)
{
statusLED(true);
char packetBuffer[128];
int len = WOL->read(packetBuffer, 128);
byte match = 0;
uint8_t mac[] = {0, 0, 0, 0, 0, 0};
uint8_t* macread = WiFi.macAddress(mac);
for (byte x = 0; x < 10; x++)
if (packetBuffer[x + 6] == macread[x])
match++;
if (match == 6)
{
String log = F("WOL : Magic packet received!");
addLog(LOG_LEVEL_INFO, log);
if (Settings.TaskDevicePin1[event->TaskIndex] != -1)
{
String log = F("WOL : Power cycle using pin: ");
log += Settings.TaskDevicePin1[event->TaskIndex];
addLog(LOG_LEVEL_INFO, log);
digitalWrite(Settings.TaskDevicePin1[event->TaskIndex], Settings.TaskDevicePluginConfig[event->TaskIndex][0]);
delay(500);
digitalWrite(Settings.TaskDevicePin1[event->TaskIndex], !Settings.TaskDevicePluginConfig[event->TaskIndex][0]);
}
}
}
success = true;
break;
}
}
return success;
}