diff --git a/ThinkingHome.Console/ThinkingHome.Console.csproj b/ThinkingHome.Console/ThinkingHome.Console.csproj index 7418c0f..40ea2a7 100644 --- a/ThinkingHome.Console/ThinkingHome.Console.csproj +++ b/ThinkingHome.Console/ThinkingHome.Console.csproj @@ -27,6 +27,7 @@ + diff --git a/ThinkingHome.Console/appsettings.json b/ThinkingHome.Console/appsettings.json index 56d5f4b..f760a65 100644 --- a/ThinkingHome.Console/appsettings.json +++ b/ThinkingHome.Console/appsettings.json @@ -61,6 +61,9 @@ "useSSL": false, "disableCertificateValidation": true }, + "ThinkingHome.Plugins.Waterius.WateriusPlugin": { + "mqttTopic": "waterius/slon/" + }, "ThinkingHome.Plugins.Mqtt.MqttPlugin": { "host": "localhost", "port": 1883, diff --git a/ThinkingHome.Core.Plugins/README.md b/ThinkingHome.Core.Plugins/README.md index e6b11b1..291e31c 100644 --- a/ThinkingHome.Core.Plugins/README.md +++ b/ThinkingHome.Core.Plugins/README.md @@ -68,7 +68,7 @@ public class MyPlugin : PluginBase { private readonly OtherPlugin otherPlugin; - public PluginBase(OtherPlugin otherPlugin) { + public MyPlugin(OtherPlugin otherPlugin) { // сохраняем полученный экземпляр плагина в поле своего плагина this.otherPlugin = otherPlugin; } diff --git a/ThinkingHome.Plugins.Tmp/ThinkingHome.Plugins.Tmp.csproj b/ThinkingHome.Plugins.Tmp/ThinkingHome.Plugins.Tmp.csproj index 5b4575d..7798716 100644 --- a/ThinkingHome.Plugins.Tmp/ThinkingHome.Plugins.Tmp.csproj +++ b/ThinkingHome.Plugins.Tmp/ThinkingHome.Plugins.Tmp.csproj @@ -36,7 +36,7 @@ - + diff --git a/ThinkingHome.Plugins.Waterius/Model/MeterData.cs b/ThinkingHome.Plugins.Waterius/Model/MeterData.cs new file mode 100644 index 0000000..32ba426 --- /dev/null +++ b/ThinkingHome.Plugins.Waterius/Model/MeterData.cs @@ -0,0 +1,8 @@ +namespace ThinkingHome.Plugins.Waterius.Model; + +public class MeterData { + public Guid Id { get; set; } + public DateTime Date { get; set; } + public float Value0 { get; set; } + public float Value1 { get; set; } +} diff --git a/ThinkingHome.Plugins.Waterius/Model/Migrations/Migration01.cs b/ThinkingHome.Plugins.Waterius/Model/Migrations/Migration01.cs new file mode 100644 index 0000000..c93a2b7 --- /dev/null +++ b/ThinkingHome.Plugins.Waterius/Model/Migrations/Migration01.cs @@ -0,0 +1,24 @@ +using System.Data; +using ThinkingHome.Migrator.Framework; + +namespace ThinkingHome.Plugins.Waterius.Model.Migrations; + +[Migration(1)] +public class Migration01 : Migration +{ + + public override void Apply() + { + Database.AddTable("Waterius_MeterData", + new Column("Id", DbType.Guid, ColumnProperty.PrimaryKey), + new Column("Date", DbType.Date, ColumnProperty.NotNull), + new Column("Value0", DbType.Decimal, ColumnProperty.Null), + new Column("Value1", DbType.Decimal, ColumnProperty.Null) + ); + } + + public override void Revert() + { + Database.RemoveTable("Waterius_MeterData"); + } +} diff --git a/ThinkingHome.Plugins.Waterius/ThinkingHome.Plugins.Waterius.csproj b/ThinkingHome.Plugins.Waterius/ThinkingHome.Plugins.Waterius.csproj new file mode 100644 index 0000000..38535f8 --- /dev/null +++ b/ThinkingHome.Plugins.Waterius/ThinkingHome.Plugins.Waterius.csproj @@ -0,0 +1,19 @@ + + + + ThinkingHome plugin that receives water meter readings and stores them in a database. The following device is used to interact with water meters https://waterius.ru + net9.0 + enable + enable + + + + + + + + + + + + diff --git a/ThinkingHome.Plugins.Waterius/WateriusPlugin.cs b/ThinkingHome.Plugins.Waterius/WateriusPlugin.cs new file mode 100644 index 0000000..b8c35c4 --- /dev/null +++ b/ThinkingHome.Plugins.Waterius/WateriusPlugin.cs @@ -0,0 +1,50 @@ +using System.Text; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using ThinkingHome.Core.Plugins; +using ThinkingHome.Plugins.Database; +using ThinkingHome.Plugins.Mqtt; +using ThinkingHome.Plugins.Mqtt.DynamicConfiguration; +using ThinkingHome.Plugins.Waterius.Model; + +namespace ThinkingHome.Plugins.Waterius; + +public class WateriusPlugin : PluginBase { + + [DbModelBuilder] + public void InitModel(ModelBuilder modelBuilder) + { + modelBuilder.Entity(cfg => cfg.ToTable("Waterius_MeterData")); + } + + [ConfigureMqtt] + public void WateriusListeners(MqttConfigurationBuilder config) + { + config.RegisterListener(MqttTopic?.Trim('/') + "/#", HandleMqttMessage); + } + + private void HandleMqttMessage(string topic, byte[] payload) + { + var str = Encoding.UTF8.GetString(payload); + + Logger.LogInformation($"{topic}: {str}"); + } + public string? MqttTopic => Configuration["mqttTopic"]; + + private readonly MqttPlugin mqttPlugin; + + public WateriusPlugin(MqttPlugin mqttPlugin) + { + this.mqttPlugin = mqttPlugin; + } + + public override void InitPlugin() + { + if (string.IsNullOrWhiteSpace(MqttTopic)) { + Logger.LogWarning("MQTT Topic is undefined"); + } + else { + Logger.LogInformation("Listen to waterius in topic: {MqttTopic}...", MqttTopic); + } + } +} diff --git a/ThinkingHome.sln b/ThinkingHome.sln index eeef70c..8a46f28 100644 --- a/ThinkingHome.sln +++ b/ThinkingHome.sln @@ -50,6 +50,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThinkingHome.Plugins.Telegr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThinkingHome.Plugins.WebUi", "ThinkingHome.Plugins.WebUi\ThinkingHome.Plugins.WebUi.csproj", "{003AE996-5F8D-414E-A084-CB93B91D10B1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThinkingHome.Plugins.Waterius", "ThinkingHome.Plugins.Waterius\ThinkingHome.Plugins.Waterius.csproj", "{207620D4-55C5-4D8E-9463-3BDE0BA31A15}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -148,6 +150,18 @@ Global {003AE996-5F8D-414E-A084-CB93B91D10B1}.Release|x64.Build.0 = Release|Any CPU {003AE996-5F8D-414E-A084-CB93B91D10B1}.Release|x86.ActiveCfg = Release|Any CPU {003AE996-5F8D-414E-A084-CB93B91D10B1}.Release|x86.Build.0 = Release|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Release|Any CPU.Build.0 = Release|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Debug|x64.ActiveCfg = Debug|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Debug|x64.Build.0 = Debug|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Debug|x86.ActiveCfg = Debug|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Debug|x86.Build.0 = Debug|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Release|x64.ActiveCfg = Release|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Release|x64.Build.0 = Release|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Release|x86.ActiveCfg = Release|Any CPU + {207620D4-55C5-4D8E-9463-3BDE0BA31A15}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -169,6 +183,7 @@ Global {CDCBFFD1-7FBD-496E-BD42-581F66BEB085} = {5DF04DCB-BC26-42FA-B7D6-CFC24963F1A8} {960A9C44-3D0F-42F4-8F81-F89588EAC9E0} = {5DF04DCB-BC26-42FA-B7D6-CFC24963F1A8} {003AE996-5F8D-414E-A084-CB93B91D10B1} = {5DF04DCB-BC26-42FA-B7D6-CFC24963F1A8} + {207620D4-55C5-4D8E-9463-3BDE0BA31A15} = {5DF04DCB-BC26-42FA-B7D6-CFC24963F1A8} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0