Converted google home traits to be async
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
@@ -87,21 +87,21 @@ impl OnMqtt for AudioSetup {
|
||||
|
||||
match action {
|
||||
RemoteAction::On => {
|
||||
if self.mixer.is_on().unwrap() {
|
||||
self.speakers.set_on(false).unwrap();
|
||||
self.mixer.set_on(false).unwrap();
|
||||
if self.mixer.is_on().await.unwrap() {
|
||||
self.speakers.set_on(false).await.unwrap();
|
||||
self.mixer.set_on(false).await.unwrap();
|
||||
} else {
|
||||
self.speakers.set_on(true).unwrap();
|
||||
self.mixer.set_on(true).unwrap();
|
||||
self.speakers.set_on(true).await.unwrap();
|
||||
self.mixer.set_on(true).await.unwrap();
|
||||
}
|
||||
},
|
||||
RemoteAction::BrightnessMoveUp => {
|
||||
if !self.mixer.is_on().unwrap() {
|
||||
self.mixer.set_on(true).unwrap();
|
||||
} else if self.speakers.is_on().unwrap() {
|
||||
self.speakers.set_on(false).unwrap();
|
||||
if !self.mixer.is_on().await.unwrap() {
|
||||
self.mixer.set_on(true).await.unwrap();
|
||||
} else if self.speakers.is_on().await.unwrap() {
|
||||
self.speakers.set_on(false).await.unwrap();
|
||||
} else {
|
||||
self.speakers.set_on(true).unwrap();
|
||||
self.speakers.set_on(true).await.unwrap();
|
||||
}
|
||||
},
|
||||
RemoteAction::BrightnessStop => { /* Ignore this action */ },
|
||||
@@ -116,8 +116,8 @@ impl OnPresence for AudioSetup {
|
||||
// Turn off the audio setup when we leave the house
|
||||
if !presence {
|
||||
debug!(id = self.identifier, "Turning devices off");
|
||||
self.speakers.set_on(false).unwrap();
|
||||
self.mixer.set_on(false).unwrap();
|
||||
self.speakers.set_on(false).await.unwrap();
|
||||
self.mixer.set_on(false).await.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ use google_home::{
|
||||
types::Type,
|
||||
GoogleHomeDevice,
|
||||
};
|
||||
use pollster::FutureExt as _;
|
||||
use rumqttc::{AsyncClient, Publish};
|
||||
use serde::Deserialize;
|
||||
use std::time::Duration;
|
||||
@@ -170,7 +169,7 @@ impl OnPresence for IkeaOutlet {
|
||||
// Turn off the outlet when we leave the house (Not if it is a battery charger)
|
||||
if !presence && self.outlet_type != OutletType::Charger {
|
||||
debug!(id = self.identifier, "Turning device off");
|
||||
self.set_on(false).ok();
|
||||
self.set_on(false).await.ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -206,13 +205,14 @@ impl GoogleHomeDevice for IkeaOutlet {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl traits::OnOff for IkeaOutlet {
|
||||
fn is_on(&self) -> Result<bool, ErrorCode> {
|
||||
async fn is_on(&self) -> Result<bool, ErrorCode> {
|
||||
Ok(self.last_known_state)
|
||||
}
|
||||
|
||||
fn set_on(&mut self, on: bool) -> Result<(), ErrorCode> {
|
||||
set_on(self.client.clone(), &self.mqtt.topic, on).block_on();
|
||||
async fn set_on(&mut self, on: bool) -> Result<(), ErrorCode> {
|
||||
set_on(self.client.clone(), &self.mqtt.topic, on).await;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
net::{Ipv4Addr, SocketAddr, TcpStream},
|
||||
net::{Ipv4Addr, SocketAddr},
|
||||
str::Utf8Error,
|
||||
};
|
||||
|
||||
use async_trait::async_trait;
|
||||
use bytes::{Buf, BufMut};
|
||||
use google_home::{
|
||||
errors::{self, DeviceError},
|
||||
@@ -12,6 +12,10 @@ use google_home::{
|
||||
use rumqttc::AsyncClient;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
use tokio::{
|
||||
io::{AsyncReadExt, AsyncWriteExt},
|
||||
net::TcpStream,
|
||||
};
|
||||
use tracing::trace;
|
||||
|
||||
use crate::{config::CreateDevice, error::CreateDeviceError, event::EventChannel};
|
||||
@@ -215,15 +219,18 @@ impl Response {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl traits::OnOff for KasaOutlet {
|
||||
fn is_on(&self) -> Result<bool, errors::ErrorCode> {
|
||||
let mut stream =
|
||||
TcpStream::connect(self.addr).or::<DeviceError>(Err(DeviceError::DeviceOffline))?;
|
||||
async fn is_on(&self) -> Result<bool, errors::ErrorCode> {
|
||||
let mut stream = TcpStream::connect(self.addr)
|
||||
.await
|
||||
.or::<DeviceError>(Err(DeviceError::DeviceOffline))?;
|
||||
|
||||
let body = Request::get_sysinfo().encrypt();
|
||||
stream
|
||||
.write_all(&body)
|
||||
.and(stream.flush())
|
||||
.await
|
||||
.and(stream.flush().await)
|
||||
.or::<DeviceError>(Err(DeviceError::TransientError))?;
|
||||
|
||||
let mut received = Vec::new();
|
||||
@@ -231,6 +238,7 @@ impl traits::OnOff for KasaOutlet {
|
||||
loop {
|
||||
let read = stream
|
||||
.read(&mut rx_bytes)
|
||||
.await
|
||||
.or::<errors::ErrorCode>(Err(DeviceError::TransientError.into()))?;
|
||||
|
||||
received.extend_from_slice(&rx_bytes[..read]);
|
||||
@@ -247,20 +255,22 @@ impl traits::OnOff for KasaOutlet {
|
||||
.or(Err(DeviceError::TransientError.into()))
|
||||
}
|
||||
|
||||
fn set_on(&mut self, on: bool) -> Result<(), errors::ErrorCode> {
|
||||
let mut stream =
|
||||
TcpStream::connect(self.addr).or::<DeviceError>(Err(DeviceError::DeviceOffline))?;
|
||||
async fn set_on(&mut self, on: bool) -> Result<(), errors::ErrorCode> {
|
||||
let mut stream = TcpStream::connect(self.addr)
|
||||
.await
|
||||
.or::<DeviceError>(Err(DeviceError::DeviceOffline))?;
|
||||
|
||||
let body = Request::set_relay_state(on).encrypt();
|
||||
stream
|
||||
.write_all(&body)
|
||||
.and(stream.flush())
|
||||
.await
|
||||
.and(stream.flush().await)
|
||||
.or::<DeviceError>(Err(DeviceError::TransientError))?;
|
||||
|
||||
let mut received = Vec::new();
|
||||
let mut rx_bytes = [0; 1024];
|
||||
loop {
|
||||
let read = match stream.read(&mut rx_bytes) {
|
||||
let read = match stream.read(&mut rx_bytes).await {
|
||||
Ok(read) => read,
|
||||
Err(_) => return Err(DeviceError::TransientError.into()),
|
||||
};
|
||||
|
||||
@@ -95,7 +95,7 @@ impl OnMqtt for WakeOnLAN {
|
||||
}
|
||||
};
|
||||
|
||||
self.set_active(activate).ok();
|
||||
self.set_active(activate).await.ok();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,8 +124,9 @@ impl GoogleHomeDevice for WakeOnLAN {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl traits::Scene for WakeOnLAN {
|
||||
fn set_active(&self, activate: bool) -> Result<(), ErrorCode> {
|
||||
async fn set_active(&self, activate: bool) -> Result<(), ErrorCode> {
|
||||
if activate {
|
||||
debug!(
|
||||
id = self.identifier,
|
||||
@@ -138,6 +139,7 @@ impl traits::Scene for WakeOnLAN {
|
||||
})?;
|
||||
|
||||
wol.send_magic_to((Ipv4Addr::new(0, 0, 0, 0), 0), (self.broadcast_ip, 9))
|
||||
.await
|
||||
.map_err(|err| {
|
||||
error!(id = self.identifier, "Failed to activate computer: {err}");
|
||||
google_home::errors::DeviceError::TransientError.into()
|
||||
|
||||
Reference in New Issue
Block a user