WIP energy engine update
This commit is contained in:
		@@ -58,13 +58,52 @@ impl EnergyEngine {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn refresh(&mut self, curr_consumption: EnergyConsumption, devices: &[Device]) {
 | 
			
		||||
        // TODO : force creation of missing relays state
 | 
			
		||||
        // Force creation of missing relays state
 | 
			
		||||
        for d in devices {
 | 
			
		||||
            for r in &d.relays {
 | 
			
		||||
                // Requesting relay state is enough to trigger relay creation
 | 
			
		||||
                self.relay_state(r.id);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let new_relays_state = self.relays_state.clone();
 | 
			
		||||
        let mut new_relays_state = self.relays_state.clone();
 | 
			
		||||
 | 
			
		||||
        // TODO Forcefully turn off relays that belongs to offline devices
 | 
			
		||||
        // Forcefully turn off relays that belongs to offline devices
 | 
			
		||||
        for d in devices {
 | 
			
		||||
            if !self.device_state(&d.id).is_online() {
 | 
			
		||||
                for r in &d.relays {
 | 
			
		||||
                    new_relays_state.get_mut(&r.id).unwrap().on = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO Forcefully turn off relays with dependency conflicts
 | 
			
		||||
        // Forcefully turn off relays with missing dependency
 | 
			
		||||
        loop {
 | 
			
		||||
            let mut changed = false;
 | 
			
		||||
 | 
			
		||||
            for d in devices {
 | 
			
		||||
                if !self.device_state(&d.id).is_online() {
 | 
			
		||||
                    for r in &d.relays {
 | 
			
		||||
                        if !new_relays_state.get(&r.id).unwrap().on {
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // Check if any dependency of relay is off
 | 
			
		||||
                        if r.depends_on
 | 
			
		||||
                            .iter()
 | 
			
		||||
                            .any(|d| !new_relays_state.get(d).unwrap().on)
 | 
			
		||||
                        {
 | 
			
		||||
                            new_relays_state.get_mut(&r.id).unwrap().on = false;
 | 
			
		||||
                            changed = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if !changed {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO Virtually turn off all relays that can be stopped
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user