Compare commits

..

1 Commits

Author SHA1 Message Date
f7194bcc5a
Partial switch to Gitea Actions
All checks were successful
Build and deploy automation_rs / cargo fmt (push) Successful in 2m12s
Build and deploy automation_rs / cargo clippy (push) Successful in 2m33s
Build and deploy automation_rs / cargo build (push) Successful in 4m57s
2023-11-17 01:21:43 +01:00
30 changed files with 211 additions and 142 deletions

View File

@ -14,6 +14,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with:
shared-key: "automation_rs"
- name: Rustfmt check - name: Rustfmt check
uses: actions-rust-lang/rustfmt@v1 uses: actions-rust-lang/rustfmt@v1
@ -24,6 +26,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with:
shared-key: "automation_rs"
- name: Clippy - name: Clippy
run: cargo clippy --all-targets --all -- -D warnings run: cargo clippy --all-targets --all -- -D warnings
@ -34,6 +38,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with:
shared-key: "automation_rs"
- name: Build - name: Build
run: cargo build --release run: cargo build --release

View File

@ -1,2 +0,0 @@
imports_granularity = "Module"
group_imports = "StdExternalCrate"

View File

@ -110,7 +110,7 @@ devices:
!ContactSensor !ContactSensor
topic: "zigbee2mqtt/hallway/frontdoor" topic: "zigbee2mqtt/hallway/frontdoor"
presence: presence:
topic: "automation/presence/contact/frontdoor" topic: "automation_dev/presence/contact/frontdoor"
timeout: 900 timeout: 900
trigger: trigger:
devices: ["hallway_lights"] devices: ["hallway_lights"]

View File

@ -1,11 +1,13 @@
use async_trait::async_trait; use async_trait::async_trait;
use serde::Serialize; use serde::Serialize;
use crate::errors::{DeviceError, ErrorCode}; use crate::{
use crate::request::execute::CommandType; errors::{DeviceError, ErrorCode},
use crate::response; request::execute::CommandType,
use crate::traits::{FanSpeed, OnOff, Scene, Trait}; response,
use crate::types::Type; traits::{FanSpeed, OnOff, Scene, Trait},
types::Type,
};
// TODO: Find a more elegant way to do this // TODO: Find a more elegant way to do this
pub trait AsGoogleHomeDevice { pub trait AsGoogleHomeDevice {

View File

@ -1,14 +1,15 @@
use std::collections::HashMap; use std::{collections::HashMap, sync::Arc};
use std::sync::Arc;
use futures::future::{join_all, OptionFuture}; use futures::future::{join_all, OptionFuture};
use thiserror::Error; use thiserror::Error;
use tokio::sync::{Mutex, RwLock}; use tokio::sync::{Mutex, RwLock};
use crate::device::AsGoogleHomeDevice; use crate::{
use crate::errors::{DeviceError, ErrorCode}; device::AsGoogleHomeDevice,
use crate::request::{self, Intent, Request}; errors::{DeviceError, ErrorCode},
use crate::response::{self, execute, query, sync, Response, ResponsePayload, State}; request::{self, Intent, Request},
response::{self, execute, query, sync, Response, ResponsePayload, State},
};
#[derive(Debug)] #[derive(Debug)]
pub struct GoogleHome { pub struct GoogleHome {

View File

@ -13,6 +13,7 @@ pub mod traits;
pub mod types; pub mod types;
pub use device::GoogleHomeDevice; pub use device::GoogleHomeDevice;
pub use fullfillment::{FullfillmentError, GoogleHome}; pub use fullfillment::FullfillmentError;
pub use fullfillment::GoogleHome;
pub use request::Request; pub use request::Request;
pub use response::Response; pub use response::Response;

View File

@ -1,7 +1,6 @@
use serde::Serialize; use serde::Serialize;
use crate::errors::ErrorCode; use crate::{errors::ErrorCode, response::State};
use crate::response::State;
#[derive(Debug, Serialize, Clone)] #[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -88,8 +87,10 @@ pub enum Status {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::errors::DeviceError; use crate::{
use crate::response::{Response, ResponsePayload, State}; errors::DeviceError,
response::{Response, ResponsePayload, State},
};
#[test] #[test]
fn serialize() { fn serialize() {

View File

@ -2,8 +2,7 @@ use std::collections::HashMap;
use serde::Serialize; use serde::Serialize;
use crate::errors::ErrorCode; use crate::{errors::ErrorCode, response::State};
use crate::response::State;
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]

View File

@ -69,9 +69,11 @@ impl Device {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::response::{Response, ResponsePayload}; use crate::{
use crate::traits::Trait; response::{Response, ResponsePayload},
use crate::types::Type; traits::Trait,
types::Type,
};
#[test] #[test]
fn serialize() { fn serialize() {

View File

@ -1,7 +1,6 @@
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::{format_ident, quote, ToTokens}; use quote::{format_ident, quote, ToTokens};
use syn::parse::Parse; use syn::{parse::Parse, parse_macro_input, Ident, ItemTrait, Path, Token, TypeParamBound};
use syn::{parse_macro_input, Ident, ItemTrait, Path, Token, TypeParamBound};
struct Attr { struct Attr {
name: Ident, name: Ident,

View File

@ -1,7 +1,8 @@
use axum::async_trait; use axum::{
use axum::extract::{FromRef, FromRequestParts}; async_trait,
use axum::http::request::Parts; extract::{FromRef, FromRequestParts},
use axum::http::StatusCode; http::{request::Parts, StatusCode},
};
use serde::Deserialize; use serde::Deserialize;
use crate::error::{ApiError, ApiErrorJson}; use crate::error::{ApiError, ApiErrorJson};

View File

@ -1,6 +1,8 @@
use std::fs; use std::{
use std::net::{Ipv4Addr, SocketAddr}; fs,
use std::time::Duration; net::{Ipv4Addr, SocketAddr},
time::Duration,
};
use indexmap::IndexMap; use indexmap::IndexMap;
use regex::{Captures, Regex}; use regex::{Captures, Regex};
@ -8,11 +10,13 @@ use rumqttc::{MqttOptions, Transport};
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
use tracing::debug; use tracing::debug;
use crate::auth::OpenIDConfig; use crate::{
use crate::device_manager::DeviceConfigs; auth::OpenIDConfig,
use crate::devices::PresenceConfig; device_manager::DeviceConfigs,
use crate::error::{ConfigParseError, MissingEnv}; devices::PresenceConfig,
use crate::schedule::Schedule; error::{ConfigParseError, MissingEnv},
schedule::Schedule,
};
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct Config { pub struct Config {

View File

@ -11,14 +11,19 @@ use tokio::sync::{RwLock, RwLockReadGuard};
use tokio_cron_scheduler::{Job, JobScheduler}; use tokio_cron_scheduler::{Job, JobScheduler};
use tracing::{debug, error, instrument, trace}; use tracing::{debug, error, instrument, trace};
use crate::devices::{ use crate::{
devices::{
AirFilterConfig, As, AudioSetupConfig, ContactSensorConfig, DebugBridgeConfig, Device, AirFilterConfig, As, AudioSetupConfig, ContactSensorConfig, DebugBridgeConfig, Device,
HueBridgeConfig, HueGroupConfig, IkeaOutletConfig, KasaOutletConfig, LightSensorConfig, HueBridgeConfig, HueGroupConfig, IkeaOutletConfig, KasaOutletConfig, LightSensorConfig,
WakeOnLANConfig, WasherConfig, WakeOnLANConfig, WasherConfig,
},
error::DeviceConfigError,
event::OnDarkness,
event::OnNotification,
event::OnPresence,
event::{Event, EventChannel, OnMqtt},
schedule::{Action, Schedule},
}; };
use crate::error::DeviceConfigError;
use crate::event::{Event, EventChannel, OnDarkness, OnMqtt, OnNotification, OnPresence};
use crate::schedule::{Action, Schedule};
pub struct ConfigExternal<'a> { pub struct ConfigExternal<'a> {
pub client: &'a AsyncClient, pub client: &'a AsyncClient,

View File

@ -3,13 +3,17 @@ use google_home::traits::OnOff;
use serde::Deserialize; use serde::Deserialize;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use crate::{
config::MqttDeviceConfig,
device_manager::{ConfigExternal, DeviceConfig, WrappedDevice},
devices::As,
error::DeviceConfigError,
event::OnMqtt,
event::OnPresence,
messages::{RemoteAction, RemoteMessage},
};
use super::Device; use super::Device;
use crate::config::MqttDeviceConfig;
use crate::device_manager::{ConfigExternal, DeviceConfig, WrappedDevice};
use crate::devices::As;
use crate::error::DeviceConfigError;
use crate::event::{OnMqtt, OnPresence};
use crate::messages::{RemoteAction, RemoteMessage};
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct AudioSetupConfig { pub struct AudioSetupConfig {

View File

@ -8,14 +8,18 @@ use serde_with::{serde_as, DurationSeconds};
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use crate::{
config::MqttDeviceConfig,
device_manager::{ConfigExternal, DeviceConfig, WrappedDevice},
devices::{As, DEFAULT_PRESENCE},
error::DeviceConfigError,
event::OnMqtt,
event::OnPresence,
messages::{ContactMessage, PresenceMessage},
traits::Timeout,
};
use super::Device; use super::Device;
use crate::config::MqttDeviceConfig;
use crate::device_manager::{ConfigExternal, DeviceConfig, WrappedDevice};
use crate::devices::{As, DEFAULT_PRESENCE};
use crate::error::DeviceConfigError;
use crate::event::{OnMqtt, OnPresence};
use crate::messages::{ContactMessage, PresenceMessage};
use crate::traits::Timeout;
// NOTE: If we add more presence devices we might need to move this out of here // NOTE: If we add more presence devices we might need to move this out of here
#[serde_as] #[serde_as]

View File

@ -3,12 +3,16 @@ use rumqttc::AsyncClient;
use serde::Deserialize; use serde::Deserialize;
use tracing::warn; use tracing::warn;
use crate::config::MqttDeviceConfig; use crate::device_manager::ConfigExternal;
use crate::device_manager::{ConfigExternal, DeviceConfig}; use crate::device_manager::DeviceConfig;
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError; use crate::error::DeviceConfigError;
use crate::event::{OnDarkness, OnPresence}; use crate::event::OnDarkness;
use crate::messages::{DarknessMessage, PresenceMessage}; use crate::event::OnPresence;
use crate::{
config::MqttDeviceConfig,
messages::{DarknessMessage, PresenceMessage},
};
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct DebugBridgeConfig { pub struct DebugBridgeConfig {

View File

@ -4,10 +4,13 @@ use async_trait::async_trait;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tracing::{error, trace, warn}; use tracing::{error, trace, warn};
use crate::device_manager::{ConfigExternal, DeviceConfig}; use crate::{
use crate::devices::Device; device_manager::{ConfigExternal, DeviceConfig},
use crate::error::DeviceConfigError; devices::Device,
use crate::event::{OnDarkness, OnPresence}; error::DeviceConfigError,
event::OnDarkness,
event::OnPresence,
};
#[derive(Debug)] #[derive(Debug)]
pub enum Flag { pub enum Flag {

View File

@ -1,21 +1,25 @@
use std::net::{Ipv4Addr, SocketAddr}; use std::{
use std::time::Duration; net::{Ipv4Addr, SocketAddr},
time::Duration,
};
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use async_trait::async_trait; use async_trait::async_trait;
use google_home::errors::ErrorCode; use google_home::{errors::ErrorCode, traits::OnOff};
use google_home::traits::OnOff;
use rumqttc::Publish; use rumqttc::Publish;
use serde::Deserialize; use serde::Deserialize;
use tracing::{debug, error, warn}; use tracing::{debug, error, warn};
use crate::{
config::MqttDeviceConfig,
device_manager::{ConfigExternal, DeviceConfig},
error::DeviceConfigError,
event::OnMqtt,
messages::{RemoteAction, RemoteMessage},
traits::Timeout,
};
use super::Device; use super::Device;
use crate::config::MqttDeviceConfig;
use crate::device_manager::{ConfigExternal, DeviceConfig};
use crate::error::DeviceConfigError;
use crate::event::OnMqtt;
use crate::messages::{RemoteAction, RemoteMessage};
use crate::traits::Timeout;
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct HueGroupConfig { pub struct HueGroupConfig {
@ -225,8 +229,7 @@ impl Timeout for HueGroup {
mod message { mod message {
use std::time::Duration; use std::time::Duration;
use serde::ser::SerializeStruct; use serde::{ser::SerializeStruct, Deserialize, Serialize};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct Action { pub struct Action {

View File

@ -1,14 +1,17 @@
use std::time::Duration;
use anyhow::Result; use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use google_home::errors::ErrorCode; use google_home::errors::ErrorCode;
use google_home::traits::{self, OnOff}; use google_home::{
use google_home::types::Type; device,
use google_home::{device, GoogleHomeDevice}; traits::{self, OnOff},
types::Type,
GoogleHomeDevice,
};
use rumqttc::{matches, AsyncClient, Publish}; use rumqttc::{matches, AsyncClient, Publish};
use serde::Deserialize; use serde::Deserialize;
use serde_with::{serde_as, DurationSeconds}; use serde_with::serde_as;
use serde_with::DurationSeconds;
use std::time::Duration;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
@ -16,7 +19,8 @@ use crate::config::{InfoConfig, MqttDeviceConfig};
use crate::device_manager::{ConfigExternal, DeviceConfig}; use crate::device_manager::{ConfigExternal, DeviceConfig};
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError; use crate::error::DeviceConfigError;
use crate::event::{OnMqtt, OnPresence}; use crate::event::OnMqtt;
use crate::event::OnPresence;
use crate::messages::{OnOffMessage, RemoteAction, RemoteMessage}; use crate::messages::{OnOffMessage, RemoteAction, RemoteMessage};
use crate::traits::Timeout; use crate::traits::Timeout;

View File

@ -1,19 +1,28 @@
use std::net::{Ipv4Addr, SocketAddr}; use std::{
use std::str::Utf8Error; net::{Ipv4Addr, SocketAddr},
str::Utf8Error,
};
use async_trait::async_trait; use async_trait::async_trait;
use bytes::{Buf, BufMut}; use bytes::{Buf, BufMut};
use google_home::errors::{self, DeviceError}; use google_home::{
use google_home::traits; errors::{self, DeviceError},
traits,
};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use thiserror::Error; use thiserror::Error;
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::{
use tokio::net::TcpStream; io::{AsyncReadExt, AsyncWriteExt},
net::TcpStream,
};
use tracing::trace; use tracing::trace;
use crate::{
device_manager::{ConfigExternal, DeviceConfig},
error::DeviceConfigError,
};
use super::Device; use super::Device;
use crate::device_manager::{ConfigExternal, DeviceConfig};
use crate::error::DeviceConfigError;
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct KasaOutletConfig { pub struct KasaOutletConfig {

View File

@ -3,12 +3,15 @@ use rumqttc::Publish;
use serde::Deserialize; use serde::Deserialize;
use tracing::{debug, trace, warn}; use tracing::{debug, trace, warn};
use crate::config::MqttDeviceConfig; use crate::{
use crate::device_manager::{ConfigExternal, DeviceConfig}; config::MqttDeviceConfig,
use crate::devices::Device; device_manager::{ConfigExternal, DeviceConfig},
use crate::error::DeviceConfigError; devices::Device,
use crate::event::{self, Event, OnMqtt}; error::DeviceConfigError,
use crate::messages::BrightnessMessage; event::OnMqtt,
event::{self, Event},
messages::BrightnessMessage,
};
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct LightSensorConfig { pub struct LightSensorConfig {

View File

@ -12,9 +12,6 @@ mod presence;
mod wake_on_lan; mod wake_on_lan;
mod washer; mod washer;
use google_home::device::AsGoogleHomeDevice;
use google_home::traits::OnOff;
pub use self::air_filter::AirFilterConfig; pub use self::air_filter::AirFilterConfig;
pub use self::audio_setup::AudioSetupConfig; pub use self::audio_setup::AudioSetupConfig;
pub use self::contact_sensor::ContactSensorConfig; pub use self::contact_sensor::ContactSensorConfig;
@ -28,8 +25,11 @@ pub use self::ntfy::{Notification, Ntfy};
pub use self::presence::{Presence, PresenceConfig, DEFAULT_PRESENCE}; pub use self::presence::{Presence, PresenceConfig, DEFAULT_PRESENCE};
pub use self::wake_on_lan::WakeOnLANConfig; pub use self::wake_on_lan::WakeOnLANConfig;
pub use self::washer::WasherConfig; pub use self::washer::WasherConfig;
use crate::event::{OnDarkness, OnMqtt, OnNotification, OnPresence};
use google_home::{device::AsGoogleHomeDevice, traits::OnOff};
use crate::traits::Timeout; use crate::traits::Timeout;
use crate::{event::OnDarkness, event::OnMqtt, event::OnNotification, event::OnPresence};
#[impl_cast::device(As: OnMqtt + OnPresence + OnDarkness + OnNotification + OnOff + Timeout)] #[impl_cast::device(As: OnMqtt + OnPresence + OnDarkness + OnNotification + OnOff + Timeout)]
pub trait Device: AsGoogleHomeDevice + std::fmt::Debug + Sync + Send { pub trait Device: AsGoogleHomeDevice + std::fmt::Debug + Sync + Send {

View File

@ -5,9 +5,12 @@ use serde::Serialize;
use serde_repr::*; use serde_repr::*;
use tracing::{debug, error, warn}; use tracing::{debug, error, warn};
use crate::config::NtfyConfig; use crate::{
use crate::devices::Device; config::NtfyConfig,
use crate::event::{self, Event, EventChannel, OnNotification, OnPresence}; devices::Device,
event::{self, Event, EventChannel},
event::{OnNotification, OnPresence},
};
#[derive(Debug)] #[derive(Debug)]
pub struct Ntfy { pub struct Ntfy {

View File

@ -5,10 +5,13 @@ use rumqttc::Publish;
use serde::Deserialize; use serde::Deserialize;
use tracing::{debug, warn}; use tracing::{debug, warn};
use crate::config::MqttDeviceConfig; use crate::{
use crate::devices::Device; config::MqttDeviceConfig,
use crate::event::{self, Event, EventChannel, OnMqtt}; devices::Device,
use crate::messages::PresenceMessage; event::OnMqtt,
event::{self, Event, EventChannel},
messages::PresenceMessage,
};
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct PresenceConfig { pub struct PresenceConfig {

View File

@ -2,20 +2,26 @@ use std::net::Ipv4Addr;
use async_trait::async_trait; use async_trait::async_trait;
use eui48::MacAddress; use eui48::MacAddress;
use google_home::errors::ErrorCode; use google_home::{
use google_home::traits::{self, Scene}; device,
use google_home::types::Type; errors::ErrorCode,
use google_home::{device, GoogleHomeDevice}; traits::{self, Scene},
types::Type,
GoogleHomeDevice,
};
use rumqttc::Publish; use rumqttc::Publish;
use serde::Deserialize; use serde::Deserialize;
use tracing::{debug, error, trace}; use tracing::{debug, error, trace};
use crate::{
config::{InfoConfig, MqttDeviceConfig},
device_manager::{ConfigExternal, DeviceConfig},
error::DeviceConfigError,
event::OnMqtt,
messages::ActivateMessage,
};
use super::Device; use super::Device;
use crate::config::{InfoConfig, MqttDeviceConfig};
use crate::device_manager::{ConfigExternal, DeviceConfig};
use crate::error::DeviceConfigError;
use crate::event::OnMqtt;
use crate::messages::ActivateMessage;
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct WakeOnLANConfig { pub struct WakeOnLANConfig {

View File

@ -3,13 +3,15 @@ use rumqttc::Publish;
use serde::Deserialize; use serde::Deserialize;
use tracing::{debug, error, warn}; use tracing::{debug, error, warn};
use super::ntfy::Priority; use crate::{
use super::{Device, Notification}; config::MqttDeviceConfig,
use crate::config::MqttDeviceConfig; device_manager::{ConfigExternal, DeviceConfig},
use crate::device_manager::{ConfigExternal, DeviceConfig}; error::DeviceConfigError,
use crate::error::DeviceConfigError; event::{Event, EventChannel, OnMqtt},
use crate::event::{Event, EventChannel, OnMqtt}; messages::PowerMessage,
use crate::messages::PowerMessage; };
use super::{ntfy::Priority, Device, Notification};
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct WasherConfig { pub struct WasherConfig {

View File

@ -1,7 +1,6 @@
use std::{error, fmt, result}; use std::{error, fmt, result};
use axum::http::status::InvalidStatusCode; use axum::{http::status::InvalidStatusCode, response::IntoResponse};
use axum::response::IntoResponse;
use bytes::Bytes; use bytes::Bytes;
use rumqttc::ClientError; use rumqttc::ClientError;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};

View File

@ -1,8 +1,9 @@
use async_trait::async_trait; use async_trait::async_trait;
use impl_cast::device_trait;
use rumqttc::Publish; use rumqttc::Publish;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use impl_cast::device_trait;
use crate::devices::Notification; use crate::devices::Notification;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@ -1,22 +1,23 @@
#![feature(async_closure)] #![feature(async_closure)]
use std::process; use std::process;
use automation::auth::{OpenIDConfig, User}; use axum::{
use automation::config::Config; extract::FromRef, http::StatusCode, response::IntoResponse, routing::post, Json, Router,
use automation::device_manager::DeviceManager; };
use automation::devices::{Ntfy, Presence};
use automation::error::ApiError;
use automation::mqtt;
use axum::extract::FromRef;
use axum::http::StatusCode;
use axum::response::IntoResponse;
use axum::routing::post;
use axum::{Json, Router};
use dotenvy::dotenv; use dotenvy::dotenv;
use google_home::{GoogleHome, Request};
use rumqttc::AsyncClient; use rumqttc::AsyncClient;
use tracing::{debug, error, info}; use tracing::{debug, error, info};
use automation::{
auth::{OpenIDConfig, User},
config::Config,
device_manager::DeviceManager,
devices::{Ntfy, Presence},
error::ApiError,
mqtt,
};
use google_home::{GoogleHome, Request};
#[derive(Clone)] #[derive(Clone)]
struct AppState { struct AppState {
pub openid: OpenIDConfig, pub openid: OpenIDConfig,

View File

@ -1,6 +1,7 @@
use rumqttc::{Event, EventLoop, Incoming};
use tracing::{debug, warn}; use tracing::{debug, warn};
use rumqttc::{Event, EventLoop, Incoming};
use crate::event::{self, EventChannel}; use crate::event::{self, EventChannel};
pub fn start(mut eventloop: EventLoop, event_channel: &EventChannel) { pub fn start(mut eventloop: EventLoop, event_channel: &EventChannel) {