Further work on automatically generating lua type definitions

This commit is contained in:
2024-04-30 02:08:29 +02:00
parent 2e553038ba
commit 27324e2c70
25 changed files with 510 additions and 101 deletions

View File

@@ -0,0 +1,57 @@
use automation::config::MqttDeviceConfig;
use automation::devices::{
AirFilter, AirFilterConfig, AudioSetup, AudioSetupConfig, ContactSensor, ContactSensorConfig,
DebugBridge, DebugBridgeConfig, FlagIDs, HueBridge, HueBridgeConfig, HueGroup, HueGroupConfig,
IkeaOutlet, IkeaOutletConfig, KasaOutlet, KasaOutletConfig, LightSensor, LightSensorConfig,
Ntfy, NtfyConfig, Presence, PresenceConfig, PresenceDeviceConfig, TriggerConfig, WakeOnLAN,
WakeOnLANConfig, Washer, WasherConfig,
};
fn main() {
println!("-- WARN: This file is automatically generated, do not manually edit\n");
println!("---@meta");
println!("{}", MqttDeviceConfig::generate_lua_definition());
println!("{}", AirFilter::generate_lua_definition());
println!("{}", AirFilterConfig::generate_lua_definition());
println!("{}", AudioSetup::generate_lua_definition());
println!("{}", AudioSetupConfig::generate_lua_definition());
println!("{}", ContactSensor::generate_lua_definition());
println!("{}", ContactSensorConfig::generate_lua_definition());
println!("{}", PresenceDeviceConfig::generate_lua_definition());
println!("{}", TriggerConfig::generate_lua_definition());
println!("{}", DebugBridge::generate_lua_definition());
println!("{}", DebugBridgeConfig::generate_lua_definition());
println!("{}", HueBridge::generate_lua_definition());
println!("{}", HueBridgeConfig::generate_lua_definition());
println!("{}", FlagIDs::generate_lua_definition());
println!("{}", HueGroup::generate_lua_definition());
println!("{}", HueGroupConfig::generate_lua_definition());
println!("{}", IkeaOutlet::generate_lua_definition());
println!("{}", IkeaOutletConfig::generate_lua_definition());
println!("{}", KasaOutlet::generate_lua_definition());
println!("{}", KasaOutletConfig::generate_lua_definition());
println!("{}", LightSensor::generate_lua_definition());
println!("{}", LightSensorConfig::generate_lua_definition());
println!("{}", Ntfy::generate_lua_definition());
println!("{}", NtfyConfig::generate_lua_definition());
println!("{}", Presence::generate_lua_definition());
println!("{}", PresenceConfig::generate_lua_definition());
println!("{}", WakeOnLAN::generate_lua_definition());
println!("{}", WakeOnLANConfig::generate_lua_definition());
println!("{}", Washer::generate_lua_definition());
println!("{}", WasherConfig::generate_lua_definition());
}

View File

@@ -1,6 +1,7 @@
use std::net::{Ipv4Addr, SocketAddr};
use std::time::Duration;
use automation_macro::LuaTypeDefinition;
use rumqttc::{MqttOptions, Transport};
use serde::Deserialize;
@@ -52,7 +53,7 @@ fn default_fulfillment_port() -> u16 {
7878
}
#[derive(Debug, Clone, Deserialize)]
#[derive(Debug, Clone, Deserialize, LuaTypeDefinition)]
pub struct InfoConfig {
pub name: String,
pub room: Option<String>,
@@ -68,7 +69,7 @@ impl InfoConfig {
}
}
#[derive(Debug, Clone, Deserialize)]
#[derive(Debug, Clone, Deserialize, LuaTypeDefinition)]
pub struct MqttDeviceConfig {
pub topic: String,
}

View File

@@ -1,5 +1,5 @@
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use google_home::device::Name;
use google_home::errors::ErrorCode;
use google_home::traits::{AvailableSpeeds, FanSpeed, HumiditySetting, OnOff, Speed, SpeedValues};
@@ -15,7 +15,7 @@ use crate::event::OnMqtt;
use crate::messages::{AirFilterFanState, AirFilterState, SetAirFilterFanState};
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct AirFilterConfig {
#[device_config(flatten)]
pub info: InfoConfig,

View File

@@ -1,5 +1,5 @@
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use google_home::traits::OnOff;
use tracing::{debug, error, trace, warn};
@@ -11,7 +11,7 @@ use crate::event::{OnMqtt, OnPresence};
use crate::messages::{RemoteAction, RemoteMessage};
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct AudioSetupConfig {
pub identifier: String,
#[device_config(flatten)]

View File

@@ -1,7 +1,7 @@
use std::time::Duration;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use google_home::traits::OnOff;
use mlua::FromLua;
use tokio::task::JoinHandle;
@@ -18,11 +18,11 @@ use crate::mqtt::WrappedAsyncClient;
use crate::traits::Timeout;
// NOTE: If we add more presence devices we might need to move this out of here
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct PresenceDeviceConfig {
#[device_config(flatten)]
pub mqtt: MqttDeviceConfig,
#[device_config(with(Duration::from_secs))]
#[device_config(from(u64), with(Duration::from_secs))]
pub timeout: Duration,
}
@@ -41,15 +41,15 @@ impl From<TriggerDevicesHelper> for Vec<(WrappedDevice, bool)> {
}
}
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct TriggerConfig {
#[device_config(from_lua, from(TriggerDevicesHelper))]
pub devices: Vec<(WrappedDevice, bool)>,
#[device_config(default, with(|t: Option<_>| t.map(Duration::from_secs)))]
#[device_config(default, from(Option<u64>), with(|t: Option<_>| t.map(Duration::from_secs)))]
pub timeout: Option<Duration>,
}
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct ContactSensorConfig {
pub identifier: String,
#[device_config(flatten)]

View File

@@ -1,7 +1,7 @@
use std::convert::Infallible;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use tracing::{trace, warn};
use super::LuaDeviceCreate;
@@ -11,7 +11,7 @@ use crate::event::{OnDarkness, OnPresence};
use crate::messages::{DarknessMessage, PresenceMessage};
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, LuaDeviceConfig, Clone)]
#[derive(Debug, LuaDeviceConfig, Clone, LuaTypeDefinition)]
pub struct DebugBridgeConfig {
pub identifier: String,
#[device_config(flatten)]

View File

@@ -1,8 +1,8 @@
use std::convert::Infallible;
use std::net::SocketAddr;
use std::net::{Ipv4Addr, SocketAddr};
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use serde::{Deserialize, Serialize};
use tracing::{error, trace, warn};
@@ -16,16 +16,16 @@ pub enum Flag {
Darkness,
}
#[derive(Debug, Clone, Deserialize)]
#[derive(Debug, Clone, Deserialize, LuaTypeDefinition)]
pub struct FlagIDs {
presence: isize,
darkness: isize,
}
#[derive(Debug, LuaDeviceConfig, Clone)]
#[derive(Debug, LuaDeviceConfig, Clone, LuaTypeDefinition)]
pub struct HueBridgeConfig {
pub identifier: String,
#[device_config(rename("ip"), with(|ip| SocketAddr::new(ip, 80)))]
#[device_config(rename("ip"), from(Ipv4Addr), with(|ip| SocketAddr::new(ip, 80)))]
pub addr: SocketAddr,
pub login: String,
pub flags: FlagIDs,

View File

@@ -1,9 +1,9 @@
use std::net::SocketAddr;
use std::net::{Ipv4Addr, SocketAddr};
use std::time::Duration;
use anyhow::{anyhow, Context, Result};
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use google_home::errors::ErrorCode;
use google_home::traits::OnOff;
use rumqttc::{Publish, SubscribeFilter};
@@ -16,10 +16,10 @@ use crate::messages::{RemoteAction, RemoteMessage};
use crate::mqtt::WrappedAsyncClient;
use crate::traits::Timeout;
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct HueGroupConfig {
pub identifier: String,
#[device_config(rename("ip"), with(|ip| SocketAddr::new(ip, 80)))]
#[device_config(rename("ip"), from(Ipv4Addr), with(|ip| SocketAddr::new(ip, 80)))]
pub addr: SocketAddr,
pub login: String,
pub group_id: isize,

View File

@@ -2,7 +2,7 @@ use std::time::Duration;
use anyhow::Result;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use google_home::errors::ErrorCode;
use google_home::traits::{self, OnOff};
use google_home::types::Type;
@@ -28,7 +28,7 @@ pub enum OutletType {
Light,
}
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct IkeaOutletConfig {
#[device_config(flatten)]
pub info: InfoConfig,
@@ -36,7 +36,7 @@ pub struct IkeaOutletConfig {
pub mqtt: MqttDeviceConfig,
#[device_config(default(OutletType::Outlet))]
pub outlet_type: OutletType,
#[device_config(default, with(|t: Option<_>| t.map(Duration::from_secs)))]
#[device_config(default, from(Option<u64>), with(|t: Option<_>| t.map(Duration::from_secs)))]
pub timeout: Option<Duration>,
#[device_config(default)]
pub remotes: Vec<MqttDeviceConfig>,

View File

@@ -1,9 +1,9 @@
use std::convert::Infallible;
use std::net::SocketAddr;
use std::net::{Ipv4Addr, SocketAddr};
use std::str::Utf8Error;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use bytes::{Buf, BufMut};
use google_home::errors::{self, DeviceError};
use google_home::traits;
@@ -15,10 +15,10 @@ use tracing::trace;
use super::{Device, LuaDeviceCreate};
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct KasaOutletConfig {
pub identifier: String,
#[device_config(rename("ip"), with(|ip| SocketAddr::new(ip, 9999)))]
#[device_config(rename("ip"), from(Ipv4Addr), with(|ip| SocketAddr::new(ip, 9999)))]
pub addr: SocketAddr,
}

View File

@@ -1,5 +1,5 @@
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use rumqttc::Publish;
use tracing::{debug, trace, warn};
@@ -10,14 +10,14 @@ use crate::event::{self, Event, EventChannel, OnMqtt};
use crate::messages::BrightnessMessage;
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct LightSensorConfig {
pub identifier: String,
#[device_config(flatten)]
pub mqtt: MqttDeviceConfig,
pub min: isize,
pub max: isize,
#[device_config(rename("event_channel"), from_lua, with(|ec: EventChannel| ec.get_tx()))]
#[device_config(rename("event_channel"), from(EventChannel), from_lua, with(|ec: EventChannel| ec.get_tx()))]
pub tx: event::Sender,
#[device_config(from_lua)]
pub client: WrappedAsyncClient,

View File

@@ -7,7 +7,7 @@ mod hue_group;
mod ikea_outlet;
mod kasa_outlet;
mod light_sensor;
mod ntfy;
pub mod ntfy;
mod presence;
mod wake_on_lan;
mod washer;
@@ -28,7 +28,7 @@ pub use self::hue_group::*;
pub use self::ikea_outlet::*;
pub use self::kasa_outlet::*;
pub use self::light_sensor::*;
pub use self::ntfy::{Notification, Ntfy};
pub use self::ntfy::{Ntfy, NtfyConfig};
pub use self::presence::{Presence, PresenceConfig, DEFAULT_PRESENCE};
pub use self::wake_on_lan::*;
pub use self::washer::*;

View File

@@ -2,7 +2,7 @@ use std::collections::HashMap;
use std::convert::Infallible;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use serde::Serialize;
use serde_repr::*;
use tracing::{error, trace, warn};
@@ -111,12 +111,12 @@ impl Default for Notification {
}
}
#[derive(Debug, LuaDeviceConfig)]
#[derive(Debug, LuaDeviceConfig, LuaTypeDefinition)]
pub struct NtfyConfig {
#[device_config(default("https://ntfy.sh".into()))]
pub url: String,
pub topic: String,
#[device_config(rename("event_channel"), from_lua, with(|ec: EventChannel| ec.get_tx()))]
#[device_config(rename("event_channel"), from_lua, from(EventChannel), with(|ec: EventChannel| ec.get_tx()))]
pub tx: event::Sender,
}

View File

@@ -1,7 +1,7 @@
use std::collections::HashMap;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use rumqttc::Publish;
use tracing::{debug, trace, warn};
@@ -12,11 +12,11 @@ use crate::event::{self, Event, EventChannel, OnMqtt};
use crate::messages::PresenceMessage;
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, LuaDeviceConfig)]
#[derive(Debug, LuaDeviceConfig, LuaTypeDefinition)]
pub struct PresenceConfig {
#[device_config(flatten)]
pub mqtt: MqttDeviceConfig,
#[device_config(from_lua, rename("event_channel"), with(|ec: EventChannel| ec.get_tx()))]
#[device_config(from_lua, rename("event_channel"), from(EventChannel), with(|ec: EventChannel| ec.get_tx()))]
pub tx: event::Sender,
#[device_config(from_lua)]
pub client: WrappedAsyncClient,

View File

@@ -1,7 +1,7 @@
use std::net::Ipv4Addr;
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use eui48::MacAddress;
use google_home::errors::ErrorCode;
use google_home::traits::{self, Scene};
@@ -16,7 +16,7 @@ use crate::event::OnMqtt;
use crate::messages::ActivateMessage;
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct WakeOnLANConfig {
#[device_config(flatten)]
pub info: InfoConfig,

View File

@@ -1,23 +1,24 @@
use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig};
use automation_macro::{LuaDevice, LuaDeviceConfig, LuaTypeDefinition};
use rumqttc::Publish;
use tracing::{debug, error, trace, warn};
use super::ntfy::Priority;
use super::{Device, LuaDeviceCreate, Notification};
use super::{Device, LuaDeviceCreate};
use crate::config::MqttDeviceConfig;
use crate::devices::ntfy::Notification;
use crate::event::{self, Event, EventChannel, OnMqtt};
use crate::messages::PowerMessage;
use crate::mqtt::WrappedAsyncClient;
#[derive(Debug, Clone, LuaDeviceConfig)]
#[derive(Debug, Clone, LuaDeviceConfig, LuaTypeDefinition)]
pub struct WasherConfig {
pub identifier: String,
#[device_config(flatten)]
pub mqtt: MqttDeviceConfig,
// Power in Watt
pub threshold: f32,
#[device_config(rename("event_channel"), from_lua, with(|ec: EventChannel| ec.get_tx()))]
#[device_config(rename("event_channel"), from_lua, from(EventChannel), with(|ec: EventChannel| ec.get_tx()))]
pub tx: event::Sender,
#[device_config(from_lua)]
pub client: WrappedAsyncClient,

View File

@@ -3,7 +3,7 @@ use mlua::FromLua;
use rumqttc::Publish;
use tokio::sync::mpsc;
use crate::devices::Notification;
use crate::devices::ntfy::Notification;
#[derive(Debug, Clone)]
pub enum Event {