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