Welcome, Guest
Username: Password: Remember me

TOPIC: Sumarize minutes a DI was true last 24h

Sumarize minutes a DI was true last 24h 1 year 7 months ago #2697

Hi there
Friend of mine has a Solar Panel (about 70 kw/h) which gives me a Virtual DI (call it POWER), when it is running on 50% ore more.
When I get this signal, I switch some consumers (water heating) via ethernet, works great.
Now Problem is:
- If I got 180 minutes or more during a day, I do not need to switch the consumers (water heating) from 22:00 til 06:00
- If I got less than 180 minutes during a day, I need to turn the consumers on at night.

Does anyone have a idea how to calculate this?

Of course I can do this on bash by raspberry pi, but that is ugly! B)

I tried:
1- To create a Virtual DI and increment its value (when POWER is ture) by cron (every minute)
but I was not able to write the value back to virtual DI, it is asking for string, but I have double and can not convert.
I also do not understand why to write a Value to DI in string fromat?
2- Use a Variable, but I do not now, how to make my counter "global" so that it can increment its value every minute when cron is running:
public void Setup(){
}
public void Run(){
  int ism;
  ModuleParameter s = ModuleHelper.GetProperty(Domains.VIRTUAL, "N2S0", "Sensor.DigitalValue");
  if (s.Value  == "1"){
    if (ism <= 0 || ism >=6000 ){ism = 0;}
    ism = ism + 1;
    Console.WriteLine("sunshine=" + s.Value);
    Console.WriteLine("sunshine_minutes=" + ism);
    }
} 

I would prefere to get variant 1 running, because I would be able to write a graph with "daily sunshine minutes"

Help is highly welcome!
Chris

PS: I woud write down a howto about the entire solustion into this forum when it is running, hopefully others can use it also.
The administrator has disabled public write access.

Sumarize minutes a DI was true last 24h 1 year 7 months ago #2700

I found a solution by converting Values to integer and back to string.
It seems to work, but sadly, cron is broken on raspberry pi.
so I can't use my solution :( :
public void Setup(){
}

public void Run(){
  // Console.WriteLine("Run");
  ModuleParameter s = ModuleHelper.GetProperty(Domains.VIRTUAL, "N2S0", "Sensor.DigitalValue");
  ModuleParameter sm = ModuleHelper.GetProperty(Domains.VIRTUAL, "N5S0", "Sensor.AnalogValue");
  if (s.Value  == "1"){
    //Console.WriteLine("sunshine=" + s.Value);
    int tsm = Int32.Parse(sm.Value);
    tsm = tsm + 10;
    //Console.WriteLine("out=" + tsm);
    DriverHelper.ProcessCommad(Domains.VIRTUAL, "N5S0", "ControlLevel", tsm.ToString());
  }
} 
The administrator has disabled public write access.

Sumarize minutes a DI was true last 24h 1 year 7 months ago #2715

Hi, I found a solution
Not sure if it is elegant, but it works like a charme!

This are the Sensors/Switches:
string SOLAR_OVERFLOW_WANTED_DAILY = "N1S0";
string SOLAR_OVERFLOW_SENSOR = "N2S0";
string SOLAR_OVERFLOW_CONSUMER1 = "N3S0";
string SOLAR_OVERFLOW_CONSUMER2 = "N4S0";
string SOLAR_OVERFLOW_DAILY_MINUTES = "N5S0";

Here are my automation scripts:

Program name: control overfolw consumer devices
Cron Settings: (empty)
public void Setup() 
{ 
  //string SOLAR_OVERFLOW_WANTED_DAILY  = "N1S0";
  string SOLAR_OVERFLOW_SENSOR        = "N2S0";
  string SOLAR_OVERFLOW_CONSUMER1     = "N3S0";
  string SOLAR_OVERFLOW_CONSUMER2     = "N4S0";
  //string SOLAR_OVERFLOW_DAILY_MINUTES = "N5S0";
  EventHelper.ModuleChangedHandler((o, m, p) => 
  {  
    // filter digital switch - change module address 
    if (m.Domain == Domains.VIRTUAL && m.Address == SOLAR_OVERFLOW_SENSOR && p.Property == "Sensor.DigitalValue"){ 
      // filter when switch on event  
      if (p.Value == "1") 
      { 
        DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER1, "ControlOn", "");       
        DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER2, "ControlOn", "");       
      } else {
        DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER1, "ControlOff", "");       
        DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER2, "ControlOff", "");     
      }
    } 
    return true;  
  });  
} 
public void Run() 
{ 
}

Program name: calculate daily minutes of overflow
Cron Settings: * * * * *
public void Setup(){
}

public void Run(){
  //string SOLAR_OVERFLOW_WANTED_DAILY  = "N1S0";
  string SOLAR_OVERFLOW_SENSOR        = "N2S0";
  //string SOLAR_OVERFLOW_CONSUMER1     = "N3S0";
  //string SOLAR_OVERFLOW_CONSUMER2     = "N4S0";
  string SOLAR_OVERFLOW_DAILY_MINUTES = "N5S0";
  ModuleParameter so = ModuleHelper.GetProperty(Domains.VIRTUAL, SOLAR_OVERFLOW_SENSOR, "Sensor.DigitalValue");
  ModuleParameter som = ModuleHelper.GetProperty(Domains.VIRTUAL, SOLAR_OVERFLOW_DAILY_MINUTES, "Sensor.AnalogValue");
  if (so.Value  == "1"){ // solar power has overflow
    int isom = Int32.Parse(som.Value);
    isom = isom + 1;
    DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_DAILY_MINUTES, "ControlLevel", isom.ToString());
  }
}

Program name: off-peak period begin
Cron Settings: 0 22 * * *
public void Setup(){
}

public void Run(){
  string SOLAR_OVERFLOW_WANTED_DAILY  = "N1S0";
  //string SOLAR_OVERFLOW_SENSOR        = "N2S0";
  string SOLAR_OVERFLOW_CONSUMER1     = "N3S0";
  string SOLAR_OVERFLOW_CONSUMER2     = "N4S0";
  string SOLAR_OVERFLOW_DAILY_MINUTES = "N5S0";
  
  ModuleParameter som = ModuleHelper.GetProperty(Domains.VIRTUAL, SOLAR_OVERFLOW_DAILY_MINUTES, "Sensor.AnalogValue");
  ModuleParameter sow = ModuleHelper.GetProperty(Domains.VIRTUAL, SOLAR_OVERFLOW_WANTED_DAILY, "Sensor.AnalogValue");
  int isom = Int32.Parse(som.Value);
  int isow = Int32.Parse(sow.Value);
  if (isow  >= isom){ // solar overflow limit NOT reached
    DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER1, "ControlOn", "");
    DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER2, "ControlOn", "");
  }
}

Program name: off-peak period end
Cron Settings: 0 6 * * *
public void Setup(){
}

public void Run(){
  //string SOLAR_OVERFLOW_WANTED_DAILY  = "N1S0";
  //string SOLAR_OVERFLOW_SENSOR        = "N2S0";
  string SOLAR_OVERFLOW_CONSUMER1     = "N3S0";
  string SOLAR_OVERFLOW_CONSUMER2     = "N4S0";
  string SOLAR_OVERFLOW_DAILY_MINUTES = "N5S0";
  DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER1, "ControlOff", "");
  DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_CONSUMER2, "ControlOff", ""); 
  DriverHelper.ProcessCommad(Domains.VIRTUAL, SOLAR_OVERFLOW_DAILY_MINUTES, "ControlLevel", "0");
}

How it goes:
- sumarize the minutes, solar overflow has switched the consumers on during the day
- at 22:00, decide if overflow was big enough to disable heating with off-peak electricity
- at 6:00 reset the overflow counter and disable the off-peak electricity consumers (if enabled last night or not)

thanks for all the help and documentation in this forum
chris
Last Edit: 1 year 7 months ago by Ruettimann.
The administrator has disabled public write access.
Time to create page: 0.102 seconds
Powered by Kunena Forum