Skip to content

Commit

Permalink
Add sibling/master relations
Browse files Browse the repository at this point in the history
  • Loading branch information
enesbcs committed Sep 20, 2018
1 parent aac8052 commit c3dab5c
Showing 1 changed file with 139 additions and 48 deletions.
187 changes: 139 additions & 48 deletions _P160_OutputMulti.ino
Expand Up @@ -3,11 +3,16 @@
##########################################################################################
Features :
- Records max 4 GPIO output states in UserVars
- Records max 4 GPIO output states in UserVars (max 3 instance means 3x4 output pin)
- One "blocker" line belongs to every GPIO,
when blocker evaluates to >= 1 then GPIO can not be set to active state
otherwise GPIO can be setted
- changing values has to be done with the "output" command!
- can be specified one master relay task (proposed type:P029 Output), this gpio will be high
AFTER any output pin (or sibling output pin) switched to high, and master relay still high
until any output pin (or sibling output pin) switched to high, master relay will be low
directly BEFORE the last of the output pins (+sibling output pins if used) go to low
Sibling output tasks has to be P160 MultiOut task number or 0 if not used
List of commands :
- output,[devicename],[pin_number],[status] Set specific GPIO status of the named task (0/1)
Expand Down Expand Up @@ -84,9 +89,14 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
//addFormPinSelect(F("Relay 3"), F("taskdevicepin3"), Settings.TaskDevicePin3[event->TaskIndex]);
LoadTaskSettings(event->TaskIndex);
addFormPinSelect(F("4th GPIO"), F("taskdevicepin4"), Settings.TaskDevicePluginConfig[event->TaskIndex][0]);
addFormCheckBox(F("Active state is LOW"), F("Plugin_160_inverted"), Settings.TaskDevicePluginConfig[event->TaskIndex][1]);

addFormNote(F("You can specify 4 output pin above."));
addFormCheckBox(F("Active state is LOW"), F("Plugin_160_inverted"), Settings.TaskDevicePluginConfig[event->TaskIndex][1]);
addFormNumericBox(F("Use Master relay at Task number"), F("Plugin_160_mr"), Settings.TaskDevicePluginConfig[event->TaskIndex][4], 0, TASKS_MAX + 1);
addFormNumericBox(F("Use Sibling relay group#1 at Task number"), F("Plugin_160_sr1"), Settings.TaskDevicePluginConfig[event->TaskIndex][5], 0, TASKS_MAX + 1);
addFormNumericBox(F("Use Sibling relay group#2 at Task number"), F("Plugin_160_sr2"), Settings.TaskDevicePluginConfig[event->TaskIndex][6], 0, TASKS_MAX + 1);
addFormNote(F("You can specify 1 master and 2 group x 4 sibling relay (sibling relays controls the same master). Write 0's if not needed."));
addFormNumericBox(F("Master relay cooldown/warmup time"), F("Plugin_160_mrdelay"), Settings.TaskDevicePluginConfig[event->TaskIndex][7], 0, 2000);
addUnit(F("msec"));

byte baseaddr = 0;
if (event->TaskIndex > 0) {
Expand Down Expand Up @@ -117,6 +127,10 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
{
Settings.TaskDevicePluginConfig[event->TaskIndex][0] = getFormItemInt(F("taskdevicepin4"));
Settings.TaskDevicePluginConfig[event->TaskIndex][1] = isFormItemChecked(F("Plugin_160_inverted"));
Settings.TaskDevicePluginConfig[event->TaskIndex][4] = getFormItemInt(F("Plugin_160_mr"));
Settings.TaskDevicePluginConfig[event->TaskIndex][5] = getFormItemInt(F("Plugin_160_sr1"));
Settings.TaskDevicePluginConfig[event->TaskIndex][6] = getFormItemInt(F("Plugin_160_sr2"));
Settings.TaskDevicePluginConfig[event->TaskIndex][7] = getFormItemInt(F("Plugin_160_mrdelay"));

//String logs = String(F("MultiOut : Task:")) + String(event->TaskIndex) + F(" instance ") + Settings.TaskDevicePluginConfig[event->TaskIndex][3];
//addLog(LOG_LEVEL_INFO, logs);
Expand Down Expand Up @@ -154,7 +168,7 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
p160_relaycount = 2;
pinMode(Settings.TaskDevicePin2[event->TaskIndex], OUTPUT);
digitalWrite(Settings.TaskDevicePin2[event->TaskIndex], Settings.TaskDevicePluginConfig[event->TaskIndex][1]);
UserVar[event->BaseVarIndex+1] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
UserVar[event->BaseVarIndex + 1] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
}
}
if (Settings.TaskDevicePin3[event->TaskIndex] != -1)
Expand All @@ -163,7 +177,7 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
p160_relaycount = 3;
pinMode(Settings.TaskDevicePin3[event->TaskIndex], OUTPUT);
digitalWrite(Settings.TaskDevicePin3[event->TaskIndex], Settings.TaskDevicePluginConfig[event->TaskIndex][1]);
UserVar[event->BaseVarIndex+2] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
UserVar[event->BaseVarIndex + 2] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
}
}
if (Settings.TaskDevicePluginConfig[event->TaskIndex][0] != -1)
Expand All @@ -172,7 +186,7 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
p160_relaycount = 4;
pinMode(Settings.TaskDevicePluginConfig[event->TaskIndex][0], OUTPUT);
digitalWrite(Settings.TaskDevicePluginConfig[event->TaskIndex][0], Settings.TaskDevicePluginConfig[event->TaskIndex][1]);
UserVar[event->BaseVarIndex+3] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
UserVar[event->BaseVarIndex + 3] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
}
}
if (p160_relaycount < 4) {
Expand Down Expand Up @@ -200,7 +214,7 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
}
Settings.TaskDevicePluginConfig[event->TaskIndex][3] = baseaddr;

String logs = String(F("MultiOut : Task:")) + String(event->TaskIndex) + F(" instance ") + String(Settings.TaskDevicePluginConfig[event->TaskIndex][3]) + F(" gpios ")+ String(Settings.TaskDevicePluginConfig[event->TaskIndex][2]);
String logs = String(F("MultiOut : Task:")) + String(event->TaskIndex) + F(" instance ") + String(Settings.TaskDevicePluginConfig[event->TaskIndex][3]) + F(" gpios ") + String(Settings.TaskDevicePluginConfig[event->TaskIndex][2]);
addLog(LOG_LEVEL_INFO, logs);

LoadCustomTaskSettings(event->TaskIndex, (byte*)&P160_deviceTemplate[baseaddr], sizeof(P160_deviceTemplate[baseaddr]));
Expand Down Expand Up @@ -230,53 +244,130 @@ boolean Plugin_160(byte function, struct EventStruct *event, String& string)
String valueNum = parseString(string, 3);
byte relnum = (byte)valueNum.toInt();
byte pinnum = -1;
switch (relnum) {
case 0:
pinnum = Settings.TaskDevicePin1[taskIndex];
break;
case 1:
pinnum = Settings.TaskDevicePin2[taskIndex];
break;
case 2:
pinnum = Settings.TaskDevicePin3[taskIndex];
break;
case 3:
pinnum = Settings.TaskDevicePluginConfig[taskIndex][0];
break;
}
byte pinvalue = -1;
String vvalue = parseString(string, 4);
if (vvalue.length() < 1) {
pinvalue = !UserVar[BaseVarIndex1 + relnum];
} else {
pinvalue = (byte)vvalue.toInt();
}
switch (relnum) {
case 0:
pinnum = Settings.TaskDevicePin1[taskIndex];
break;
case 1:
pinnum = Settings.TaskDevicePin2[taskIndex];
break;
case 2:
pinnum = Settings.TaskDevicePin3[taskIndex];
break;
case 3:
pinnum = Settings.TaskDevicePluginConfig[taskIndex][0];
break;
}
byte pinvalue = -1;
String vvalue = parseString(string, 4);
if (vvalue.length() < 1) {
pinvalue = !UserVar[BaseVarIndex1 + relnum];
} else {
pinvalue = (byte)vvalue.toInt();
}

byte inhibaddr = Settings.TaskDevicePluginConfig[taskIndex][3];
String tmpString = String(P160_deviceTemplate[inhibaddr][relnum]);
byte inhibitvalue = parseTemplate(tmpString, 20).toInt();
if (inhibitvalue >= 1) {
logs = F("Blocker active ");
logs += String(inhibitvalue)+ F(" set to LOW");
addLog(LOG_LEVEL_INFO, logs);
pinvalue = Settings.TaskDevicePluginConfig[taskIndex][1];
byte inhibaddr = Settings.TaskDevicePluginConfig[taskIndex][3];
String tmpString = String(P160_deviceTemplate[inhibaddr][relnum]);
byte inhibitvalue = parseTemplate(tmpString, 20).toInt();
if (inhibitvalue >= 1) {
logs = F("Blocker active ");
logs += String(inhibitvalue) + F(" set to LOW");
addLog(LOG_LEVEL_INFO, logs);
pinvalue = Settings.TaskDevicePluginConfig[taskIndex][1];
}
byte TaskIndexM = Settings.TaskDevicePluginConfig[taskIndex][4];
byte BaseVarIndexM = 0;
if ( (pinvalue == Settings.TaskDevicePluginConfig[taskIndex][1]) && (TaskIndexM > 0) ) {
TaskIndexM = TaskIndexM - 1; // tasks are 0 based in memory, 1 based on webgui

BaseVarIndexM = TaskIndexM * VARS_PER_TASK;
if (UserVar[BaseVarIndexM] != pinvalue) {
bool AllOff = true;

for (byte TVI = 0; TVI < Settings.TaskDevicePluginConfig[taskIndex][2]; TVI++) // check own values
{
if (relnum != TVI) {
if (UserVar[BaseVarIndex1 + TVI] != Settings.TaskDevicePluginConfig[taskIndex][1]) {
AllOff = false;
break;
}
}
}
byte TaskIndexS = 0;
byte BaseVarIndexS = 0;
if (AllOff) {
TaskIndexS = Settings.TaskDevicePluginConfig[taskIndex][5];
if (TaskIndexS > 0) {
TaskIndexS = TaskIndexS - 1;

BaseVarIndexS = TaskIndexS * VARS_PER_TASK;
for (byte TVI = 0; TVI < Settings.TaskDevicePluginConfig[TaskIndexS][2]; TVI++) // check first sibling values
{
if (UserVar[BaseVarIndexS + TVI] != Settings.TaskDevicePluginConfig[taskIndex][1]) {
AllOff = false;
break;
}
}
}
}
if (AllOff) {
TaskIndexS = Settings.TaskDevicePluginConfig[taskIndex][6];
if (TaskIndexS > 0) {
TaskIndexS = TaskIndexS - 1;
BaseVarIndexS = TaskIndexS * VARS_PER_TASK;
for (byte TVI = 0; TVI < Settings.TaskDevicePluginConfig[TaskIndexS][2]; TVI++) // check second sibling values
{
if (UserVar[BaseVarIndexS + TVI] != Settings.TaskDevicePluginConfig[taskIndex][1]) {
AllOff = false;
break;
}
}
}
}
if (AllOff) {
logs = F("Master relay set to LOW ");
logs += String(Settings.TaskDevicePin1[TaskIndexM]);
addLog(LOG_LEVEL_INFO, logs);
pinMode(Settings.TaskDevicePin1[TaskIndexM], OUTPUT);
digitalWrite(Settings.TaskDevicePin1[TaskIndexM], pinvalue);
UserVar[BaseVarIndexM] = pinvalue;
delay(Settings.TaskDevicePluginConfig[taskIndex][7]); // cooldown delay
}
}
}

if (pinvalue != -1) {
if (pinnum != -1) {
pinMode(pinnum, OUTPUT);
digitalWrite(pinnum, pinvalue);
}
UserVar[BaseVarIndex1 + relnum] = pinvalue;
String events = getTaskDeviceName(taskIndex);
events += F("#");
events += ExtraTaskSettings.TaskDeviceValueNames[relnum];
events += F("=");
events += String(pinvalue);
rulesProcessing(events);
if (pinvalue != -1) {
if (pinnum != -1) {
pinMode(pinnum, OUTPUT);
digitalWrite(pinnum, pinvalue);
}
UserVar[BaseVarIndex1 + relnum] = pinvalue;
String events = getTaskDeviceName(taskIndex);
events += F("#");
events += ExtraTaskSettings.TaskDeviceValueNames[relnum];
events += F("=");
events += String(pinvalue);
rulesProcessing(events);
}
logs = String(F("MultiOut : ")) + taskName + F(" GPIO ") + pinnum + F(" value: ") + pinvalue;
addLog(LOG_LEVEL_INFO, logs);

if ( ((!pinvalue) == Settings.TaskDevicePluginConfig[taskIndex][1]) && (TaskIndexM > 0) ) {
TaskIndexM = TaskIndexM - 1; // tasks are 0 based in memory, 1 based on webgui
logs = F("Master relay set to HIGH ");
logs += String(Settings.TaskDevicePin1[TaskIndexM]);
addLog(LOG_LEVEL_INFO, logs);

BaseVarIndexM = TaskIndexM * VARS_PER_TASK;
if (UserVar[BaseVarIndexM] != pinvalue) { // check if pin is already in high?
delay(Settings.TaskDevicePluginConfig[taskIndex][7]); // warmup delay
}

pinMode(Settings.TaskDevicePin1[TaskIndexM], OUTPUT);
digitalWrite(Settings.TaskDevicePin1[TaskIndexM], pinvalue);
UserVar[BaseVarIndexM] = pinvalue;
}

logs = F("\nOk");
SendStatus(event->Source, logs);
}
Expand Down

0 comments on commit c3dab5c

Please sign in to comment.