lnevo's virtual outlets

Share you PDE file with our community
Post Reply
rossbryant1956
Posts: 471
Joined: Sat Jan 14, 2012 2:08 pm
Location: Montgomery Village, MD

lnevo's virtual outlets

Post by rossbryant1956 »

I was playing with Lee's code on virtual outlets, uploaded to portal, decided I don't understand them enough right now, took them out of my code, re-uploaded and now cannot get them to disappear from the portal.

How can I get the portal to return back to just the 3 relay boxes I have? Thx.

my current code:

Code: Select all

    #include <ReefAngel_Features.h>
    #include <Globals.h>
    #include <RA_Wifi.h>
    #include <Wire.h>
    #include <OneWire.h>
    #include <Time.h>
    #include <ORP.h>
    #include <DS1307RTC.h>
    #include <InternalEEPROM.h>
    #include <RA_NokiaLCD.h>
    #include <RA_ATO.h>
    #include <RA_Joystick.h>
    #include <LED.h>
    #include <RA_TempSensor.h>
    #include <RA_Colors.h>
    #include <RA_CustomColors.h>
    #include <Relay.h>
    #include <RA_PWM.h>
    #include <Timer.h>
    #include <Memory.h>
    #include <IO.h>
    #include <Salinity.h>
    #include <PH.h>
    #include <WiFiAlert.h>
    #include <ReefAngel.h>
    
    // Custom Menu
    #include <avr/pgmspace.h>
    prog_char menu0_label[] PROGMEM = "Turn Lights On";
    prog_char menu1_label[] PROGMEM = "Turn Lights Off";
    prog_char menu2_label[] PROGMEM = "Start Feeding";
    prog_char menu3_label[] PROGMEM = "Start Water Change";
    prog_char menu4_label[] PROGMEM = "Clear Overheat";
    prog_char menu5_label[] PROGMEM = "Calibrate pH";
    prog_char menu6_label[] PROGMEM = "Calibrate Salinity";
    
    // Group the menu entries together
    PROGMEM const char *menu_items[] = {
    menu0_label, menu1_label, menu2_label, menu3_label, menu4_label, menu5_label, menu6_label  };
 
    // Define Custom Memory Locations
    #define Mem_B_SwabbieRepeat   115
    #define Mem_B_SwabbieTime     116
    #define Mem_I_CalDP1Vol       128
    #define Mem_I_CalDP1Time      130
    #define Mem_I_DP1Volume       132
    #define Mem_I_CalDP2Vol       134
    #define Mem_I_CalDP2Time      136
    #define Mem_I_DP2Volume       138
    #define Mem_B_MaintSkimmer    151
    #define Mem_B_PrintDebug      198
    #define Mem_B_ResetMemory     199
    
    void init_memory() {
    // Initialize Custom Memory Locations 
    InternalMemory.write(Mem_B_SwabbieRepeat,6);  
    InternalMemory.write(Mem_B_SwabbieTime,1);  
    InternalMemory.write_int(Mem_I_CalDP1Vol,11);  
    InternalMemory.write_int(Mem_I_CalDP1Time,600);  
    InternalMemory.write_int(Mem_I_DP1Volume,30);  
    InternalMemory.write_int(Mem_I_CalDP2Vol,11);  
    InternalMemory.write_int(Mem_I_CalDP2Time,600);    
    InternalMemory.write_int(Mem_I_DP2Volume,30);    
    InternalMemory.write(Mem_B_ResetMemory,false);
    }
    
    // Define Custom Variables for Portal
    #define Var_DPump1         4
    #define Var_DPump2         5
    #define Var_AcclDay        6
    
     // Define Relay Ports by Name
    #define DT_LightsOne       1
    #define DT_LightsTwo       2
    #define Unused3            3
    #define Unused4            4
    #define DT_LWM             5
    #define GT_LWM             6
    #define DosePumpOne        7
    #define DosePumpTwo        8

    #define Unused11           Box1_Port1
    #define Swabbie            Box1_Port2
    #define GT_LightsOne       Box1_Port3
    #define GT_LightsTwo       Box1_Port4
    #define DT_RWM             Box1_Port5
    #define GT_RWM             Box1_Port6
    #define DT_Heat            Box1_Port7
    #define DT_Pump            Box1_Port8
    
    #define RV_Heat            Box2_Port1
    #define RV_Pump            Box2_Port2
    #define GT_Heat            Box2_Port3
    #define Unused24           Box2_Port4
    #define GT_OverFill        Box2_Port5
    #define GT_Fill            Box2_Port6
    #define Skimmer            Box2_Port7
    #define GT_Pump            Box2_Port8
    
   // #define VO_RefillATO       Box3_Port1
   // #define VO_EnableATO       Box3_Port2
   // #define VO_StartFill       Box3_Port3
   // #define VO_Vacation        Box3_Port4
   // #define VO_AutoFeed        Box3_Port5
   // #define VO_Unused          Box3_Port6
   // #define VO_Calibrate       Box3_Port7
   // #define VO_LockPorts       Box3_Port8
  
    // Setup on controller startup/reset
    void setup() 
    {
        ReefAngel.Init();  //Initialize controller
        ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items)); // Initialize the menu
        ReefAngel.FeedingModePortsE[0] = Port8Bit; // Turn off on Box1 when feeding mode is activated is activated
        ReefAngel.FeedingModePortsE[1] = Port7Bit | Port8Bit; // Turn off on Box2 when feeding mode is activated is activated
        ReefAngel.WaterChangePorts = Port5Bit | Port6Bit ; // Turn off when water change mode is activated
        ReefAngel.WaterChangePortsE[0] = Port5Bit | Port6Bit | Port7Bit | Port8Bit; // Turn off on Box1 when water change mode is activated
        ReefAngel.WaterChangePortsE[1] = Port3Bit | Port8Bit | Port7Bit | Port6Bit | Port1Bit; // Turn off on Box1 when water change mode is activated
        // ReefAngel.PHExpMin = 1832;
        // ReefAngel.PHExpMax = 2150;
        ReefAngel.TempProbe = T2_PROBE;  // Set the 2nd plug to be DT Main temp
        ReefAngel.OverheatProbe = T2_PROBE;  // to monitor the overheat and temperatures
        ReefAngel.OverheatShutoffPorts = Port1Bit | Port2Bit;  // Items turned off when Overheat temperature exceeded
        ReefAngel.OverheatShutoffPortsE[0] = Port7Bit | Port3Bit | Box1_Port4;  // Items turned off on Box1 when Overheat temperature exceeded
        ReefAngel.OverheatShutoffPortsE[1] = Port3Bit | Port7Bit;  // Items turned off on Box2 when Overheat temperature exceeded
        InternalMemory.OverheatTemp_write( 829 ); // Set the DT Overheat temperature setting
        ReefAngel.LightsOnPorts = Port1Bit | Port2Bit; // Toggle Lights
        ReefAngel.LightsOnPortsE[0] = Port3Bit | Port4Bit; // Toggle Lights  
  
   // Ports that default on
        ReefAngel.Relay.On(DT_Pump); // Turn on DT Pump
        ReefAngel.Relay.On(GT_Pump); // Turn on GT Pump   
        ReefAngel.Relay.On(Skimmer); // Turn on Skimmer
        
   // Ports that default off
        ReefAngel.Relay.Off(Swabbie);
        
    }
    void loop()
    {

        CheckPower();           // Monitor for power outages
        CheckSwitches();        // Monitor for float switches  
        RunSwabbie();           // Skimmer neck cleaner
        // RunDosingPumps();       // Dose by volume or time
        // LogDosingPumps();       // Keep track of dosing
        // CalibrateDPumps();      // Calibrate Dosing pumps
        DelayedOnModes(Skimmer); // DelayedOn after mode change only
        
        ReefAngel.StandardLights( DT_LightsOne,14,00,22,00 ); // DT Lights on at 2:00pm and off at 10:00pm
        ReefAngel.StandardLights( DT_LightsTwo,22,00,01,00 ); // DT-Moon Lights on at 10:00am and off at 1:00am
        ReefAngel.StandardLights( GT_LightsOne,14,00,21,45 );  //GT Lights Main 2:00pm - 9:45pm
        ReefAngel.StandardLights( GT_LightsTwo,15,00,22,30 ); //GT Lights Actinic 3:00pm - 10:30pm
        ReefAngel.WavemakerRandom( DT_LWM,60,100 );
        ReefAngel.Relay.Set( DT_RWM, !ReefAngel.Relay.Status( DT_LWM ) ); //Randomize DT powerheads
        ReefAngel.WavemakerRandom1( GT_LWM,60,100 );
        ReefAngel.Relay.Set( GT_RWM, !ReefAngel.Relay.Status( GT_LWM ) ); //Randomize GT powerheads
        StandardHeater1( DT_Heat,779,791 ); //DT-Heat
        StandardHeater2( GT_Heat,779,791 ); //GT-Heat 
        ReefAngel.DosingPumpRepeat( DosePumpOne,0,720,5 );
            
       // if the hour is 2p or 8p, minute is 55 and seconds is 0, start the feeding mode
        if ( ((hour() == 14) || (hour() == 20)) &&
        (minute() == 55) &&
        (second() == 0) )
        {
         ReefAngel.FeedingModeStart();
        }   
        
       // if the hour is between 1a and 6a, start the Reservoir Pump 
         if (hour()>=1 && hour()<6)   
         ReefAngel.Relay.On(RV_Pump);
         else
         ReefAngel.Relay.Off(RV_Pump); 
  
        // turn on RV_Heat when temp falls below 76.0 and turn off when temp gets above 80.0
         if (ReefAngel.Params.Temp[T3_PROBE] <= 780 && ReefAngel.Params.Temp[T3_PROBE] > 0) ReefAngel.Relay.On(RV_Heat); 
         if (ReefAngel.Params.Temp[T3_PROBE] >= 791) ReefAngel.Relay.Off(RV_Heat);    
        
        //turn on GT Fill when switch is tripped 
         if (hour()>=19 && hour()<20)  // Turn on GT_Fill if water is needed
         ReefAngel.Relay.Set(GT_Fill,ReefAngel.IO.GetChannel(2));
  
        // This should always be the last line
         ReefAngel.Portal("rossbryant1956");
         ReefAngel.ShowInterface();
        // ReefAngel.Params.ORP=ReefAngel.PH.Read();        
    }
        
        void CheckPower() {
        static boolean powerOutage=false;
        static WiFiAlert powerAlert;

       // Power Outage - turn off everything
        if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && (!ReefAngel.Relay.IsRelayPresent(EXP2_RELAY))) // Expansion Relay NOT present
    {
        powerOutage=true;
        ReefAngel.Relay.Off(DT_LightsOne); 
        ReefAngel.Relay.Off(DT_LightsTwo); 
        ReefAngel.Relay.Off(Port3); 
        ReefAngel.Relay.Off(Port4);
        ReefAngel.Relay.Off(Port7);
        ReefAngel.Relay.Off(Port8);
        powerAlert.Send("Power+Outage!");
     }

      // Power Restored - Turn things back on
        if (powerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && ReefAngel.Relay.IsRelayPresent(EXP2_RELAY)) // Expansion Relay IS present
     {
        LastStart=now(); 
        powerOutage=false;
        ReefAngel.Relay.On(DT_LightsOne);
        ReefAngel.Relay.On(DT_LightsTwo);
        ReefAngel.Relay.On(DosePumpOne);
        ReefAngel.Relay.On(DosePumpTwo);
        powerAlert.Send("Power+restored.",true);  
     }
    }       
     // I_O Expansion & Float Valves
        
        void CheckSwitches() {
        static boolean GT_OverFillOverride=true;
        static WiFiAlert switchAlert, skimmerAlert, atoAlert;
        skimmerAlert.SetDelay(3600); 
        switchAlert.SetDelay(3600);
       
       if (ReefAngel.DisplayedMenu==FEEDING_MODE || ReefAngel.DisplayedMenu==WATERCHANGE_MODE)
       GT_OverFillOverride=true;
       
       // Turn off GT_OverFill if sump overflowing 
       
       if (!ReefAngel.IO.GetChannel(3)) {
         if (!GT_OverFillOverride) {
         switchAlert.Send("GT_Sump+level+alarm!+MixPump+disabled.");
         ReefAngel.Relay.Override(GT_OverFill,0);
         GT_OverFillOverride=true;
     } 
     } else {
        GT_OverFillOverride=false;
     }  
          
       // Turn off DT_Pump if sump overflowing 
       
       static boolean DT_OverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(0)) {
         if (!DT_OverFillOverride) {
         switchAlert.Send("DT_Tank+level+alarm!");
         ReefAngel.Relay.Override(DT_Pump,0);
         DT_OverFillOverride=true;
     } 
     } else {
        DT_OverFillOverride=false;
        ReefAngel.Relay.Override(DT_Pump,2);
     }  
     
        // Turn off GT_Pump if sump overflowing 
       
       static boolean GT_PumpOverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(1)) {
         if (!GT_PumpOverFillOverride) {
         switchAlert.Send("GT_Tank+level+alarm!");
         ReefAngel.Relay.Override(GT_Pump,0);
         GT_PumpOverFillOverride=true;
     } 
     } else {
        GT_PumpOverFillOverride=false;
        ReefAngel.Relay.Override(GT_Pump,2);
     }  
 
       // Turn off Skimmer if waste collector is full.
       if (!ReefAngel.LowATO.IsActive()) { // switch is on by default
       skimmerAlert.Send("Skimmate+container+full!+Skimmer+disabled.");
       ReefAngel.Relay.Override(Skimmer,0);
       //if (InternalMemory.read(Mem_B_MaintSkimmer) > 0) // Reset last Skimmer counter 
       //InternalMemory.write(Mem_B_MaintSkimmer,0);
      }
    
       // Turn off Skimmer if Return pump has been shutoff.   
       if (!ReefAngel.Relay.Status(DT_Pump)) {
       ReefAngel.Relay.Override(Skimmer,0);
      }
  
      // Alert if ATO timeout flag
      if (bitRead(ReefAngel.Flags,ATOTimeOutFlag))
      atoAlert.Send("ATO+timeout!+ATO+disabled.");
      }

      // Swabbie 

      void RunSwabbie() {
      int repeat=InternalMemory.read(Mem_B_SwabbieRepeat)*60;
      int runtime=InternalMemory.read(Mem_B_SwabbieTime)*60;
      static time_t t;
  
      // Manual mode
      if (ReefAngel.Relay.isMaskOn(Swabbie)) {
      ReefAngel.Relay.Override(Swabbie,2);
      t=now();
      }  

      if (now()-t < runtime) {
      ReefAngel.Relay.On(Swabbie);
      } else {
      ReefAngel.DosingPumpRepeat(Swabbie,0,repeat,runtime);    
      }  
     }
      void DelayedOnModes(byte relay) {
      static unsigned long startTime=now();

      if (startTime==LastStart && ReefAngel.HighATO.IsActive()) {
      ReefAngel.Relay.On(relay);
      } else {
      ReefAngel.Relay.DelayedOn(relay);
    }
   }  
      // Definitions for dosing pumps
    //  #define numDPumps 2
   //  byte pump[numDPumps]={ DosePumpOne, DosePumpTwo };
    //  byte varReport[numDPumps]={ Var_DPump1, Var_DPump2 };
     // byte memDPTime[numDPumps]={ Mem_B_DP1Timer, Mem_B_DP2Timer };
     // int memDPVolume[numDPumps]={ Mem_I_DP1Volume, Mem_I_DP2Volume };
     // int memDPRepeat[numDPumps]={ Mem_I_DP1RepeatInterval, Mem_I_DP2RepeatInterval };
     // int memCalTime[numDPumps]={ Mem_I_CalDP1Time, Mem_I_CalDP2Time };
    //  int memCalVol[numDPumps]={ Mem_I_CalDP1Vol, Mem_I_CalDP2Vol };
//{
     // void RunDosingPumps() {
     // float rate;
     // byte dpTime;
     // int dpRepeat, calcTime, totalVolume;

   //   static byte doseTime[numDPumps]={ 
   //   InternalMemory.read(memDPTime[0]), 
   //   InternalMemory.read(memDPTime[1]) 
   //   };
  
   //   for (int i=0;i < numDPumps; i++) {
    //  dpTime=InternalMemory.read(memDPTime[i]);
    //  dpRepeat=InternalMemory.read_int(memDPRepeat[i]);
   //   rate=(float)InternalMemory.read_int(memCalVol[i])/InternalMemory.read_int(memCalTime[i]);
   //  calcTime=(InternalMemory.read_int(memDPVolume[i])/rate)/(1440/dpRepeat);
   //   totalVolume=rate*(dpTime*(1440/dpRepeat)); 

   //   if (dpTime!=doseTime[i]) { // Memory has changed.
   //     InternalMemory.write_int(memDPVolume[i], totalVolume); // Update volume
    //    doseTime[i]=dpTime;
    //  } else if (dpTime!=calcTime) { // Calculated time has changed.
    //    InternalMemory.write(memDPTime[i], calcTime); // Update time
    //    doseTime[i]=calcTime;
    //  }

      // Make sure we're not calibrating
      //if (!ReefAngel.Relay.Status(VO_Calibrate)) 
      //ReefAngel.DosingPumpRepeat(pump[i], i*5, dpRepeat, doseTime[i]);
      //}
    // }
     
    // ReefAngel.CustomVar[7]=1;       

     void StandardHeater1(byte HeaterRelay, int LowTemp, int HighTemp)
        {
        if (ReefAngel.Params.Temp[T2_PROBE] == 0) return; // Don't turn the heater on if the temp is reading 0
        if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay); // If sensor 2 temperature <= LowTemp - turn on heater
        if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay); // If sensor 2 temperature >= HighTemp - turn off heater
        }

   void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp) //Heater for Grow Tank
    {
        if (ReefAngel.Params.Temp[T1_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
        if (ReefAngel.Params.Temp[T1_PROBE] <= LowTemp && ReefAngel.Params.Temp[T1_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
        if (ReefAngel.Params.Temp[T1_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
    }
    
      // Globals for Params on Custom Main
    byte x,y;
    char text[10];  
    
    void MenuEntry1()
    {
    ReefAngel.DisplayMenuEntry("Item 1");ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
    {
        ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
    }
    #endif  // RelayExp
    ReefAngel.Relay.Write();

    }
    void MenuEntry2()
    {
    ReefAngel.DisplayMenuEntry("Item 2");ReefAngel.Relay.RelayMaskOn = 0;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
    {
        ReefAngel.Relay.RelayMaskOnE[i] = 0;
    }
    #endif  // RelayExp
    ReefAngel.Relay.Write();

    }
    void MenuEntry3()
    {
    ReefAngel.DisplayMenuEntry("Item 3");ReefAngel.FeedingModeStart();

    }
    void MenuEntry4()
    {
    ReefAngel.DisplayMenuEntry("Item 4");ReefAngel.WaterChangeModeStart();

    }
    void MenuEntry5()
    {
    ReefAngel.DisplayMenuEntry("Item 5");ReefAngel.OverheatClear();

    }
    void MenuEntry6()
    {
    ReefAngel.DisplayMenuEntry("Item 6");ReefAngel.SetupCalibratePH();
    ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;

    }
    void MenuEntry7()
    {
    ReefAngel.DisplayMenuEntry("Item 7");ReefAngel.SetupCalibrateSalinity();
    }
    
    // End Custom Menu Globals
   
    void DrawCustomMain()
    {
      int x,y; 
      char text[7];
      
      // Date and Time
      ReefAngel.LCD.DrawDate( 6, 122 );  //6 pixels left, 122 lines down
      pingSerial();
      
      // I/O Expansion
      byte bkcolor;
      x = 14;
      y = 11;
      for ( int a=0;a<6;a++ )
      {
      ReefAngel.LCD.DrawCircleOutline( x+(a*20),y,4,COLOR_MEDIUMORCHID );
      if ( ReefAngel.IO.GetChannel(a) ) bkcolor=COLOR_WHITE; else bkcolor=COLOR_GRAY;
      ReefAngel.LCD.FillCircle( x+(a*20),y,2,bkcolor );
      }
      pingSerial();

      // Parameters
  
      ReefAngel.LCD.DrawText(0,255,18,26,"GT");  //18 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 10, 37, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,57,26,"DT"); //57 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T2_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 50, 37, text, Num8x8);
      pingSerial();
      
      ReefAngel.LCD.DrawText(0,255,94,26,"Res"); //94 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T3_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 90, 37, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,16,52,"DT pH"); //18 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.PH, 100);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 15, 65, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText( 0,255,57,52, "GT pH"); //57 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.PHExp, 100);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 55, 65, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,100,52,"Sal"); //100 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 98, 65, text, Num8x8);
      pingSerial();

      // Main Relay Box
      byte TempRelay = ReefAngel.Relay.RelayData;
      TempRelay &= ReefAngel.Relay.RelayMaskOff;
      TempRelay |= ReefAngel.Relay.RelayMaskOn;
      ReefAngel.LCD.DrawOutletBox( 12, 80, TempRelay );
      pingSerial();

       // Relay Expansion
      TempRelay = ReefAngel.Relay.RelayDataE[0];
      TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
      TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
      ReefAngel.LCD.DrawOutletBox( 12, 93, TempRelay );
      pingSerial();  
      
      // Relay Expansion
      TempRelay = ReefAngel.Relay.RelayDataE[1];
      TempRelay &= ReefAngel.Relay.RelayMaskOffE[1];
      TempRelay |= ReefAngel.Relay.RelayMaskOnE[1];
      ReefAngel.LCD.DrawOutletBox( 12, 107, TempRelay );
      pingSerial();  
    }

    void DrawCustomGraph()
    {
    // ReefAngel.LCD.DrawGraph( 5, 5 );
    }
Roscoe's Reefs - Starting Over Again:

Building new 29g Nano after landlord went berserk over my 4 75 gallon tanks, Multiple RA's, Water mixing stations, etc. Your help welcomed in remembering all I've forgotten.
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: lnevo's virtual outlets

Post by lnevo »

I think you have to take them out completely not just comment.

What did you not understand? Maybe we can talk through it.
rossbryant1956
Posts: 471
Joined: Sat Jan 14, 2012 2:08 pm
Location: Montgomery Village, MD

Re: lnevo's virtual outlets

Post by rossbryant1956 »

thx, gone to movies. Will do that later tonite. Thx for offer, just finished implementing your skimmer and swabbie code, works like a charm!! Thx! Want to do dose pumps next so stay tuned.
Roscoe's Reefs - Starting Over Again:

Building new 29g Nano after landlord went berserk over my 4 75 gallon tanks, Multiple RA's, Water mixing stations, etc. Your help welcomed in remembering all I've forgotten.
rossbryant1956
Posts: 471
Joined: Sat Jan 14, 2012 2:08 pm
Location: Montgomery Village, MD

Re: lnevo's virtual outlets

Post by rossbryant1956 »

I do remember seeing something in an old post that the system will pick up a reference to another relay box, even if commented out and then display that so I thought you right. However I did delete those commented out references and uploaded but the virtual outlet ports are still showing on the portal. Other ideas are welcome. Thx
Roscoe's Reefs - Starting Over Again:

Building new 29g Nano after landlord went berserk over my 4 75 gallon tanks, Multiple RA's, Water mixing stations, etc. Your help welcomed in remembering all I've forgotten.
rossbryant1956
Posts: 471
Joined: Sat Jan 14, 2012 2:08 pm
Location: Montgomery Village, MD

Re: lnevo's virtual outlets

Post by rossbryant1956 »

gone this morning. thx
Roscoe's Reefs - Starting Over Again:

Building new 29g Nano after landlord went berserk over my 4 75 gallon tanks, Multiple RA's, Water mixing stations, etc. Your help welcomed in remembering all I've forgotten.
Post Reply