2021-01-19 17:39:05 +01:00

144 lines
8.3 KiB
C#

using Mqtt.Client.AspNetCore.Services;
using MyCore.Interfaces.Models;
using MyCore.Interfaces.Models.Providers.Zigbee.Aqara;
using MyCore.Services.MyControlPanel;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Mqtt.Client.AspNetCore.Services.MqttClientMerossService;
namespace MyCore.Services.Devices
{
public class ActionService
{
public static bool isOpen = false;
public static long lastActionTime;
// TODO it's here that action are thrown.. Call from Mqtt Or other service like controller if from RpiServices
public async static Task HandleActionFromMQTTAsync(string topic, string message, DeviceDatabaseService _DeviceDatabaseService, ProviderDatabaseService _ProviderDatabaseService, LocationDatabaseService _LocationDatabaseService, AutomationDatabaseService _AutomationDatabaseService, string userId)
{
// TODO Check if last action is not too close for each action
var actionTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
var providers = _ProviderDatabaseService.GetAll(userId);
string[] topicSplit = topic.Split('/');
switch (topicSplit[0]) {
case "zigbee2mqtt":
var test0 = _ProviderDatabaseService.GetByType(topicSplit[0]).Id;
var anotherTest = _AutomationDatabaseService.GetByProvider(test0);
// switch case according to device type (topic !)
if (topicSplit[1].Contains("MagicCube0"))
{
var test = JsonConvert.DeserializeObject<AqaraCube>(message);
/*if (test.Action == "shake")
{
if (YeelightService.devices.Count <= 0) {
await YeelightService.GetDevices();
}
var labLamp = YeelightService.devices.Where(d => d.Hostname == "192.168.31.74").FirstOrDefault();
if (labLamp != null) {
Task.Run(async () => { await YeelightService.Toggle(labLamp); });
}
}*/
if (test.Action == "shake")
{
// TODO Check state
Zigbee2MqttRequest zigbee2MqttRequest = new Zigbee2MqttRequest() { state = "OFF", brightness = 0 };
var request = JsonConvert.SerializeObject(zigbee2MqttRequest);
MqttClientService.PublishMessage("zigbee2mqtt/LampeTable/set", request);
}
if (test.Action == "tap")
{
var provider = providers.Where(p => p.Type == "meross").FirstOrDefault();
var merossDevices = _DeviceDatabaseService.GetByProviderId(provider.Id);
var multiprise = merossDevices.Where(md => md.Name == "Multiprise bureau").FirstOrDefault();
//var prise = merossDevices.Where(md => md.Name == "Imprimante 3D").FirstOrDefault();
if (multiprise != null)
{
//As multisocket channel 0 is all the sockets, skip 0
var tests = actionTime - lastActionTime;
if (tests >= 1000) {
isOpen = !isOpen;
if (isOpen)
{
/*foreach (var channel in multiprise.channels)
{
if (i != 0)
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.OFF, i);
i++;
}*/
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.ON, 1);
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.ON, 2);
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.ON, 3);
//MqttClientMerossService.ExecuteCommand(prise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.ON, 0);
}
else
{
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.OFF, 1);
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.OFF, 2);
MqttClientMerossService.ExecuteCommand(multiprise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.OFF, 3);
//MqttClientMerossService.ExecuteCommand(prise.ServiceIdentification, Method.SET, CommandMqtt.TOGGLEX, "", "", ToggleStatus.OFF, 0);
}
}
lastActionTime = actionTime;
}
/*if (lightStateIkeaBulb == LightState.Undefined || lightStateIkeaBulb == LightState.Off)
PublishMessage("zigbee2mqtt/0x14b457fffe7628fa/set", "{\"state\": \"ON\"}");
else
PublishMessage("zigbee2mqtt/0x14b457fffe7628fa/set", "{\"state\": \"OFF\"}");*/
}
//await MqttClientOnlineService.PublishMessage("Notification", "Hey magic cube 0 !");
}
if (topicSplit[1].Contains("MotionWC"))
{
var aqaraSwitch = JsonConvert.DeserializeObject<AqaraMotion>(message);
if (aqaraSwitch.occupancy)
{
Zigbee2MqttRequest zigbee2MqttRequest = new Zigbee2MqttRequest() { state = "ON"};
var request = JsonConvert.SerializeObject(zigbee2MqttRequest);
MqttClientService.PublishMessage("zigbee2mqtt/LampeWC/set", request);
}
else {
Zigbee2MqttRequest zigbee2MqttRequest = new Zigbee2MqttRequest() { state = "OFF" };
var request = JsonConvert.SerializeObject(zigbee2MqttRequest);
MqttClientService.PublishMessage("zigbee2mqtt/LampeWC/set", request);
}
}
if (topicSplit[1].Contains("Motion0"))
{
var aqaraMotion = JsonConvert.DeserializeObject<AqaraMotion>(message);
if (aqaraMotion.occupancy)
{
Zigbee2MqttRequest zigbee2MqttRequest = new Zigbee2MqttRequest() { state = "ON", brightness = 255 };
var request = JsonConvert.SerializeObject(zigbee2MqttRequest);
MqttClientService.PublishMessage("zigbee2mqtt/GU10Bureau/set", request);
}
else
{
Zigbee2MqttRequest zigbee2MqttRequest = new Zigbee2MqttRequest() { state = "OFF", brightness = 0 };
var request = JsonConvert.SerializeObject(zigbee2MqttRequest);
MqttClientService.PublishMessage("zigbee2mqtt/GU10Bureau/set", request);
}
}
break;
default:
break;
}
}
}
}