Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
5aaad54de3 | |||
b3edfb05d9 | |||
45029f24cc | |||
ec594c0e4d | |||
fdfbdf093f |
4
central_backend/Cargo.lock
generated
4
central_backend/Cargo.lock
generated
@ -492,9 +492,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.89"
|
||||
version = "1.0.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
|
||||
checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95"
|
||||
|
||||
[[package]]
|
||||
name = "asn1"
|
||||
|
@ -39,8 +39,12 @@ pub enum ConsumptionBackend {
|
||||
/// Fronius inverter consumption
|
||||
Fronius {
|
||||
/// The origin of the domain where the webserver of the Fronius Symo can be reached
|
||||
#[clap(short, long, env = "FRONIUS_ORIG")]
|
||||
origin: String,
|
||||
#[clap(short, long, env)]
|
||||
fronius_orig: String,
|
||||
|
||||
/// Use cURL instead of reqwest to perform request
|
||||
#[clap(short, long)]
|
||||
curl: bool,
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,8 @@ pub enum ConsumptionError {
|
||||
NonExistentFile,
|
||||
#[error("The file that should contain the consumption has an invalid content!")]
|
||||
FileInvalidContent(#[source] ParseIntError),
|
||||
#[error("Failed to execute cURL request!")]
|
||||
CurlReqFailed,
|
||||
}
|
||||
|
||||
pub type EnergyConsumption = i32;
|
||||
@ -63,9 +65,21 @@ pub async fn get_curr_consumption() -> anyhow::Result<EnergyConsumption> {
|
||||
.map_err(ConsumptionError::FileInvalidContent)?)
|
||||
}
|
||||
|
||||
ConsumptionBackend::Fronius { origin } => {
|
||||
let url = format!("{origin}/solar_api/v1/GetPowerFlowRealtimeData.fcgi");
|
||||
let response = reqwest::get(url).await?.json::<FroniusResponse>().await?;
|
||||
ConsumptionBackend::Fronius { fronius_orig, curl } => {
|
||||
let url = format!("{fronius_orig}/solar_api/v1/GetPowerFlowRealtimeData.fcgi");
|
||||
|
||||
let response = match curl {
|
||||
false => reqwest::get(url).await?.json::<FroniusResponse>().await?,
|
||||
true => {
|
||||
let res = std::process::Command::new("curl").arg(url).output()?;
|
||||
|
||||
if !res.status.success() {
|
||||
return Err(ConsumptionError::CurlReqFailed.into());
|
||||
}
|
||||
|
||||
serde_json::from_slice::<FroniusResponse>(&res.stdout)?
|
||||
}
|
||||
};
|
||||
|
||||
Ok(response.body.data.site.grid_production as i32)
|
||||
}
|
||||
|
@ -45,4 +45,81 @@ The OTA update is then located in `build/main.bin`
|
||||
* DHCP configured on the network
|
||||
|
||||
## Configure server
|
||||
TODO
|
||||
|
||||
### Create a user dedicated to the central
|
||||
```bash
|
||||
sudo adduser --disabled-login central
|
||||
```
|
||||
|
||||
### Install binary
|
||||
You can use `scp` to copy the binary to the target server:
|
||||
|
||||
```bash
|
||||
scp central_backend/target/release/central_backend pierre@central:/home/pierre
|
||||
```
|
||||
|
||||
Then the executable must be installed system-wide:
|
||||
|
||||
```bash
|
||||
sudo mv central_backend /usr/local/bin/
|
||||
```
|
||||
|
||||
### Create configuration file
|
||||
Create a configuration file in `/home/central/config.yaml`:
|
||||
|
||||
```bash
|
||||
sudo touch /home/central/config.yaml
|
||||
sudo chown central:central /home/central/config.yaml
|
||||
sudo chmod 400 /home/central/config.yaml
|
||||
sudo nano /home/central/config.yaml
|
||||
```
|
||||
|
||||
Sample configuration:
|
||||
|
||||
```conf
|
||||
SECRET=RANDOM_VALUE
|
||||
COOKIE_SECURE=true
|
||||
LISTEN_ADDRESS=0.0.0.0:443
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=FIXME
|
||||
HOSTNAME=central.local
|
||||
STORAGE=/home/central/storage
|
||||
FRONIUS_ORIG=http://10.0.0.10
|
||||
```
|
||||
|
||||
### Test configuration
|
||||
Run the following command to check if the configuration is working:
|
||||
|
||||
```bash
|
||||
sudo -u central central_backend -c /home/central/config.yaml fronius -c
|
||||
```
|
||||
|
||||
### Create systemd unit file
|
||||
Once you confirmed the configuration is working, you can configure a system service, in `/etc/systemd/system/central.service`:
|
||||
|
||||
```conf
|
||||
[Unit]
|
||||
Description=Central backend server
|
||||
After=syslog.target
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
RestartSec=2s
|
||||
Type=simple
|
||||
User=central
|
||||
Group=central
|
||||
WorkingDirectory=/home/central
|
||||
ExecStart=/usr/local/bin/central_backend -c /home/central/config.yaml fronius -c
|
||||
Restart=always
|
||||
Environment=USER=central
|
||||
HOME=/home/central
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Enable & start service:
|
||||
```bash
|
||||
sudo systemctl enable central
|
||||
sudo systemctl start central
|
||||
```
|
Reference in New Issue
Block a user