Virtually turn off all relays that can be stopped
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
			
		||||
use crate::constants;
 | 
			
		||||
use crate::devices::device::{Device, DeviceId, DeviceRelayID};
 | 
			
		||||
use crate::devices::device::{Device, DeviceId, DeviceRelay, DeviceRelayID};
 | 
			
		||||
use crate::energy::consumption::EnergyConsumption;
 | 
			
		||||
use crate::utils::time_utils::time_secs;
 | 
			
		||||
use prettytable::{row, Table};
 | 
			
		||||
@@ -26,10 +26,26 @@ pub struct RelayState {
 | 
			
		||||
    since: usize,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type RelaysState = HashMap<DeviceRelayID, RelayState>;
 | 
			
		||||
 | 
			
		||||
#[derive(Default)]
 | 
			
		||||
pub struct EnergyEngine {
 | 
			
		||||
    devices_state: HashMap<DeviceId, DeviceState>,
 | 
			
		||||
    relays_state: HashMap<DeviceRelayID, RelayState>,
 | 
			
		||||
    relays_state: RelaysState,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl DeviceRelay {
 | 
			
		||||
    fn relay_has_running_dependencies(&self, s: &RelaysState, devices: &[Device]) -> bool {
 | 
			
		||||
        for d in devices {
 | 
			
		||||
            for r in &d.relays {
 | 
			
		||||
                if r.depends_on.contains(&self.id) && s.get(&r.id).unwrap().on {
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        false
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl EnergyEngine {
 | 
			
		||||
@@ -105,9 +121,38 @@ impl EnergyEngine {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO Virtually turn off all relays that can be stopped
 | 
			
		||||
        // Virtually turn off all relays that can be stopped
 | 
			
		||||
        loop {
 | 
			
		||||
            let mut changed = false;
 | 
			
		||||
 | 
			
		||||
        // TODO Turn on relays based on priority / dependencies
 | 
			
		||||
            for d in devices {
 | 
			
		||||
                for r in &d.relays {
 | 
			
		||||
                    let state = new_relays_state.get(&r.id).unwrap();
 | 
			
		||||
                    if !state.on {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Check if minimal runtime has not been reached
 | 
			
		||||
                    if (state.since + r.minimal_uptime) as i64 > time_secs() as i64 {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Check that no relay that depends on this relay are turned on
 | 
			
		||||
                    if r.relay_has_running_dependencies(&new_relays_state, devices) {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    new_relays_state.get_mut(&r.id).unwrap().on = false;
 | 
			
		||||
                    changed = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if !changed {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO Turn on relays based on priority / dependencies / enabled / min downtime
 | 
			
		||||
 | 
			
		||||
        // TODO Turn on relays with running constraints
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user