hackdose-server 0.10.0

A server to control smart plugs using data from smart meters
use std::{collections::HashMap, sync::Arc};

use hackdose_sml_parser::application::{
    domain::{AnyValue, Scale, SmlMessageEnvelope, SmlMessages},
    obis::Obis,
};
use tokio::sync::Mutex;

pub async fn find_watts(
    messages: &SmlMessages,
    mutex: Arc<Mutex<HashMap<Obis, AnyValue>>>,
) -> Option<i32> {
    for list in &messages.messages {
        match list {
            SmlMessageEnvelope::GetOpenResponse(_) => continue,
            SmlMessageEnvelope::GetListResponse(body) => {
                let values = &body.value_list;
                let identified = values
                    .iter()
                    .flat_map(|value| {
                        Obis::from_number(&value.object_name)
                            .map(|x| (x, value.value.clone(), value.scaler.clone()))
                    })
                    .collect::<Vec<_>>();

                let mut value_list = mutex.lock().await;
                for (o, v, scaler) in identified.iter() {
                    value_list.insert(o.clone(), v.scale(scaler.unwrap_or(0)).clone());
                }

                let usage = identified
                    .iter()
                    .find(|(o, _, _)| o == &Obis::SumActiveInstantaneousPower)
                    .map(|(_, v, scaler)| v.scale(scaler.unwrap_or(0)));

                if let Some(usage) = usage {
                    if let AnyValue::Signed(value) = usage {
                        return Some(value as i32);
                    }
                }
            }
            SmlMessageEnvelope::GetCloseResponse => continue,
        }
    }
    return None;
}