From 07807920711fb288b599fff21b10c968cc61395d Mon Sep 17 00:00:00 2001 From: guyluz11 Date: Thu, 13 Feb 2025 20:58:30 +0200 Subject: [PATCH 1/3] Fixing project not compiling --- .idea/misc.xml | 4 ++++ bin/cbj_hub.dart | 5 +++-- .../core/initialize_integrations_controller.dart | 1 + lib/infrastructure/core/injection.dart | 3 +-- pubspec.yaml | 4 ++-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 04f5c25..7f37698 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,8 @@ + + + diff --git a/bin/cbj_hub.dart b/bin/cbj_hub.dart index 90647f5..73eb986 100644 --- a/bin/cbj_hub.dart +++ b/bin/cbj_hub.dart @@ -3,12 +3,13 @@ import 'dart:io'; import 'package:cbj_hub/application/boot_up.dart'; import 'package:cbj_hub/infrastructure/core/initialize_integrations_controller.dart'; import 'package:cbj_hub/infrastructure/core/injection.dart'; +import 'package:cbj_hub/infrastructure/mqtt_server_repository.dart'; import 'package:cbj_integrations_controller/integrations_controller.dart'; Future main(List arguments) async { - // MqttServerRepository(); + MqttServerRepository(); // CbjWebServerRepository(); - // NodeRedRepository(); + NodeRedRepository(); SharedVariables() .asyncConstructor(arguments.firstOrNull ?? Directory.current.path); // arguments[0] is the location of the project diff --git a/lib/infrastructure/core/initialize_integrations_controller.dart b/lib/infrastructure/core/initialize_integrations_controller.dart index aefbf81..ae076de 100644 --- a/lib/infrastructure/core/initialize_integrations_controller.dart +++ b/lib/infrastructure/core/initialize_integrations_controller.dart @@ -22,6 +22,7 @@ Future initializeIntegrationsController({ } // Setting device model and checking if configuration for this model exist + setInstanceForDartNative(); await DevicePinListManager().setPhysicalDeviceType(); Hive.init(await dbPath()); diff --git a/lib/infrastructure/core/injection.dart b/lib/infrastructure/core/injection.dart index 1a68703..955a3f3 100644 --- a/lib/infrastructure/core/injection.dart +++ b/lib/infrastructure/core/injection.dart @@ -1,4 +1,3 @@ -import 'package:cbj_hub/infrastructure/core/injection.config.dart'; import 'package:cbj_hub/utils.dart'; import 'package:get_it/get_it.dart'; import 'package:injectable/injectable.dart'; @@ -12,7 +11,7 @@ late String currentEnv; Future configureInjection(String environment) async { currentEnv = environment; logger.i('Current CyBear Jinni Hub environment name: $currentEnv'); - getItCbj.init(environment: environment); + // getItCbj.init(environment: environment); } abstract class Env { diff --git a/pubspec.yaml b/pubspec.yaml index 3517aae..05a4c79 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,8 +12,8 @@ dependencies: # Contains utility classes in the style of dart:async to work with asynchronous computations. async: ^2.11.0 cbj_integrations_controller: - # path: ../cbj_integrations_controller - git: https://github.com/CyBear-Jinni/cbj_integrations_controller.git + path: ../cbj_integrations_controller + # git: https://github.com/CyBear-Jinni/cbj_integrations_controller.git # Package to create, convert, alter, and compare colors in a variety of colorspaces. color: ^3.0.0 # Compute function made available for all non-Flutter Dart programs From baae77480cc604a2e66eba1286af68cb4ea3a398 Mon Sep 17 00:00:00 2001 From: guyluz11 Date: Fri, 14 Feb 2025 00:47:20 +0200 Subject: [PATCH 2/3] wip adding NodeRED matter support --- .../matter/matter_connector_conjecture.dart | 31 +++++ .../matter/matter_device_validators.dart | 10 ++ .../matter_entities/matter_light_entity.dart | 130 ++++++++++++++++++ .../devices/matter/matter_helpers.dart | 62 +++++++++ .../node_red_matter_command_node.dart | 51 +++++++ .../node_red_matter_controller_node.dart | 18 +++ .../node_red_matter_manager_node.dart | 56 ++++++++ .../node_red_matter_subscribe_node.dart | 36 +++++ 8 files changed, 394 insertions(+) create mode 100644 lib/infrastructure/devices/matter/matter_connector_conjecture.dart create mode 100644 lib/infrastructure/devices/matter/matter_device_validators.dart create mode 100644 lib/infrastructure/devices/matter/matter_entities/matter_light_entity.dart create mode 100644 lib/infrastructure/devices/matter/matter_helpers.dart create mode 100644 lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_command_node.dart create mode 100644 lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_controller_node.dart create mode 100644 lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_manager_node.dart create mode 100644 lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_subscribe_node.dart diff --git a/lib/infrastructure/devices/matter/matter_connector_conjecture.dart b/lib/infrastructure/devices/matter/matter_connector_conjecture.dart new file mode 100644 index 0000000..5dfd7bd --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_connector_conjecture.dart @@ -0,0 +1,31 @@ +import 'dart:async'; +import 'dart:collection'; + +import 'package:cbj_hub/infrastructure/devices/matter/matter_helpers.dart'; +import 'package:cbj_integrations_controller/integrations_controller.dart'; + +class MatterConnectorConjecture extends VendorConnectorConjectureService { + factory MatterConnectorConjecture() { + return _instance; + } + + MatterConnectorConjecture._singletonContractor() + : super( + VendorsAndServices.matter, + displayName: 'Matter', + imageUrl: + 'https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse1.mm.bing.net%2Fth%3Fid%3DOIP.5oTC_gXhq0Tm5U-jFh8MQAHaFj%26pid%3DApi&f=1&ipt=3784aeff30dcaabb602b299e96c2a280e4bfdd0d309fcc3d54d006c04743cdb9&ipo=images', + uniqeMdnsList: ['_matter._tcp.local', '_matterc._udp.local'], + uniqueIdentifierNameInMdns: ['matter'], + ); + + static final MatterConnectorConjecture _instance = + MatterConnectorConjecture._singletonContractor(); + + @override + Future> newEntityToVendorDevice( + DeviceEntityBase entity, { + bool fromDb = false, + }) => + MatterHelpers.addDiscoveredDevice(entity); +} diff --git a/lib/infrastructure/devices/matter/matter_device_validators.dart b/lib/infrastructure/devices/matter/matter_device_validators.dart new file mode 100644 index 0000000..6f8da36 --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_device_validators.dart @@ -0,0 +1,10 @@ +import 'package:cbj_integrations_controller/integrations_controller.dart'; +import 'package:dartz/dartz.dart'; + +Either, String> validateMatterIdNotEmpty(String input) { + return right(input); +} + +Either, String> validateMatterPortNotEmpty(String input) { + return right(input); +} diff --git a/lib/infrastructure/devices/matter/matter_entities/matter_light_entity.dart b/lib/infrastructure/devices/matter/matter_entities/matter_light_entity.dart new file mode 100644 index 0000000..1ed13e4 --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_entities/matter_light_entity.dart @@ -0,0 +1,130 @@ +import 'dart:async'; + +import 'package:cbj_integrations_controller/integrations_controller.dart'; +import 'package:dartz/dartz.dart'; + +class MatterLightEntity extends GenericDimmableLightDE { + MatterLightEntity({ + required super.uniqueId, + required super.entityUniqueId, + required super.cbjEntityName, + required super.entityOriginalName, + required super.deviceOriginalName, + required super.deviceVendor, + required super.deviceNetworkLastUpdate, + required super.stateMassage, + required super.senderDeviceOs, + required super.senderDeviceModel, + required super.senderId, + required super.compUuid, + required super.entityStateGRPC, + required super.powerConsumption, + required super.deviceUniqueId, + required super.devicePort, + required super.deviceLastKnownIp, + required super.deviceHostName, + required super.deviceMdns, + required super.srvResourceRecord, + required super.srvTarget, + required super.ptrResourceRecord, + required super.mdnsServiceType, + required super.devicesMacAddress, + required super.entityKey, + required super.requestTimeStamp, + required super.lastResponseFromDeviceTimeStamp, + required super.entitiyCbjUniqueId, + required super.lightSwitchState, + required super.lightBrightness, + }) : super( + cbjDeviceVendor: CbjDeviceVendor(VendorsAndServices.matter), + ); + + factory MatterLightEntity.fromGeneric(GenericDimmableLightDE entity) { + return MatterLightEntity( + uniqueId: entity.uniqueId, + entityUniqueId: entity.entityUniqueId, + cbjEntityName: entity.cbjEntityName, + entityOriginalName: entity.entityOriginalName, + deviceOriginalName: entity.deviceOriginalName, + deviceVendor: entity.deviceVendor, + deviceNetworkLastUpdate: entity.deviceNetworkLastUpdate, + stateMassage: entity.stateMassage, + senderDeviceOs: entity.senderDeviceOs, + senderDeviceModel: entity.senderDeviceModel, + senderId: entity.senderId, + compUuid: entity.compUuid, + entityStateGRPC: entity.entityStateGRPC, + powerConsumption: entity.powerConsumption, + deviceUniqueId: entity.deviceUniqueId, + devicePort: entity.devicePort, + deviceLastKnownIp: entity.deviceLastKnownIp, + deviceHostName: entity.deviceHostName, + deviceMdns: entity.deviceMdns, + srvResourceRecord: entity.srvResourceRecord, + srvTarget: entity.srvTarget, + ptrResourceRecord: entity.ptrResourceRecord, + mdnsServiceType: entity.mdnsServiceType, + devicesMacAddress: entity.devicesMacAddress, + entityKey: entity.entityKey, + requestTimeStamp: entity.requestTimeStamp, + lastResponseFromDeviceTimeStamp: entity.lastResponseFromDeviceTimeStamp, + lightSwitchState: entity.lightSwitchState, + entitiyCbjUniqueId: entity.entitiyCbjUniqueId, + lightBrightness: entity.lightBrightness, + ); + } + + @override + Future> turnOnLight() async { + try { + // final setStateBodyResponse = NodeRedRepository(). + // + // if (setStateBodyResponse == null) { + // throw 'setStateBodyResponse is null'; + // } + + return right(unit); + } catch (e) { + // As we are using the fast = true the response is always + // MatterHttpException Error + return right(unit); + // return left(const CoreFailure.unexpected()); + } + } + + @override + Future> turnOffLight() async { + try { + // final setStateBodyResponse = NodeRedRepository(). + // + // if (setStateBodyResponse == null) { + // throw 'setStateBodyResponse is null'; + // } + + return right(unit); + } catch (e) { + // As we are using the fast = true the response is always + // MatterHttpException Error + return right(unit); + // return left(const CoreFailure.unexpected()); + } + } + + @override + Future> setBrightness(int value) async { + try { + // final setStateBodyResponse = NodeRedRepository(). + // + // if (setStateBodyResponse == null) { + // throw 'setStateBodyResponse is null'; + // } + + return right(unit); + } catch (e) { + // As we are using the fast = true the response is always + // MatterHttpException Error + return right(unit); + // return left(const CoreFailure.unexpected()); + } + } +} diff --git a/lib/infrastructure/devices/matter/matter_helpers.dart b/lib/infrastructure/devices/matter/matter_helpers.dart new file mode 100644 index 0000000..cf26f45 --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_helpers.dart @@ -0,0 +1,62 @@ +import 'dart:collection'; + +import 'package:cbj_hub/infrastructure/devices/matter/matter_entities/matter_light_entity.dart'; +import 'package:cbj_integrations_controller/integrations_controller.dart'; + +class MatterHelpers { + static Future> addDiscoveredDevice( + DeviceEntityBase entity, + ) async { + final String entityCbjUniqueId = entity.devicesMacAddress.getOrCrash() ?? + entity.deviceMdns.getOrCrash()!; + String name; + final String? deviceMdns = entity.deviceMdns.getOrCrash(); + final String? srvTarget = entity.srvTarget.getOrCrash(); + if (deviceMdns != null && deviceMdns.contains('-')) { + name = deviceMdns.split('-').first; + } else if (srvTarget != null) { + name = srvTarget; + } else { + name = entity.cbjEntityName.getOrCrash() ?? ''; + } + + final MatterLightEntity matterDE = MatterLightEntity( + uniqueId: entity.uniqueId, + entityUniqueId: EntityUniqueId(deviceMdns), + cbjEntityName: CbjEntityName(value: name), + entityOriginalName: entity.entityOriginalName, + deviceOriginalName: entity.deviceOriginalName, + entityStateGRPC: EntityState(EntityStateGRPC.ack), + senderDeviceOs: entity.senderDeviceOs, + deviceVendor: entity.deviceVendor, + deviceNetworkLastUpdate: entity.deviceNetworkLastUpdate, + senderDeviceModel: entity.senderDeviceModel, + senderId: entity.senderId, + compUuid: entity.compUuid, + deviceMdns: entity.deviceMdns, + srvResourceRecord: entity.srvResourceRecord, + srvTarget: entity.srvTarget, + ptrResourceRecord: entity.ptrResourceRecord, + mdnsServiceType: entity.mdnsServiceType, + deviceLastKnownIp: entity.deviceLastKnownIp, + stateMassage: entity.stateMassage, + powerConsumption: entity.powerConsumption, + devicePort: entity.devicePort, + deviceUniqueId: entity.deviceUniqueId, + deviceHostName: entity.deviceHostName, + devicesMacAddress: entity.devicesMacAddress, + entityKey: entity.entityKey, + requestTimeStamp: entity.requestTimeStamp, + lastResponseFromDeviceTimeStamp: entity.lastResponseFromDeviceTimeStamp, + entitiyCbjUniqueId: CoreUniqueId.fromUniqueString(entityCbjUniqueId), + lightSwitchState: + GenericDimmableLightSwitchState(EntityActions.undefined.toString()), + lightBrightness: GenericDimmableLightBrightness('100'), + ); + + return HashMap() + ..addEntries([ + MapEntry(entityCbjUniqueId, matterDE), + ]); + } +} diff --git a/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_command_node.dart b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_command_node.dart new file mode 100644 index 0000000..2feb6f8 --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_command_node.dart @@ -0,0 +1,51 @@ +import 'package:cbj_integrations_controller/integrations_controller.dart'; + +class NodeRedMatterManagerNode extends NodeRedVisualNodeAbstract { + NodeRedMatterManagerNode({ + required this.controller, + required this.deviceName, + required this.cluster, + required this.command, + super.name, + }) : super( + type: 'mattercommand', + ); + + final String controller; + final String deviceName; + final NodeRedMatterCommandClusterEnum cluster; + final NodeRedMatterCommandCommandEnum command; + + @override + String toString() { + return ''' + { + "id": "$id", + "type": "$type", + "name": "$name", + "controller": "$controller", + "device": "17174800272800391268-1", + "deviceName": "$deviceName", + "command": "${command.name}", + "cluster": "${cluster.asNumber}", + "data": "{}", + "dataType": "json", + "simpleMode": true, + "wires": ${fixWiresForNodeRed()} + } + '''; + } +} + +enum NodeRedMatterCommandClusterEnum { + onOff(6), + ; + + const NodeRedMatterCommandClusterEnum(this.asNumber); + final int asNumber; +} + +enum NodeRedMatterCommandCommandEnum { + toggle, + ; +} diff --git a/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_controller_node.dart b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_controller_node.dart new file mode 100644 index 0000000..6aaf68c --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_controller_node.dart @@ -0,0 +1,18 @@ +import 'package:cbj_integrations_controller/integrations_controller.dart'; + +class NodeRedMatterControllerNode extends NodeRedNodeAbstract { + NodeRedMatterControllerNode() + : super( + type: 'mattercontroller', + ); + + @override + String toString() { + return ''' + { + "id": "$id", + "type": "$type", + } + '''; + } +} diff --git a/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_manager_node.dart b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_manager_node.dart new file mode 100644 index 0000000..71a91b0 --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_manager_node.dart @@ -0,0 +1,56 @@ +import 'package:cbj_integrations_controller/integrations_controller.dart'; + +class NodeRedMatterManagerNode extends NodeRedVisualNodeAbstract { + NodeRedMatterManagerNode({ + required this.controller, + required this.deviceName, + required this.cluster, + required this.code, + required this.attr, + required this.method, + required this.label, + super.name, + }) : super( + type: 'mattermanager', + ); + + final String controller; + final String deviceName; + final String code; + final String attr; + + /// Device name + final String label; + final NodeRedMatterManagerMethodEnum method; + final int cluster; + + @override + String toString() { + return ''' + { + "id": "$id", + "type": "$type", + "name": "$name", + "controller": "$controller", + "method": "${method.name}", + "code": "$code", + "codeType": "str", + "deviceidType": "str", + "label": "$label", + "labelType": "str", + "wires": ${fixWiresForNodeRed()} + } + + '''; + } +} + +enum NodeRedMatterManagerMethodEnum { + commissionDevice, + decommissionDevice, + openCommissioningWindow, + listDevices, + getDevices, + renameDevice, + ; +} diff --git a/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_subscribe_node.dart b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_subscribe_node.dart new file mode 100644 index 0000000..545a55a --- /dev/null +++ b/lib/infrastructure/devices/matter/matter_node_red_nodes/node_red_matter_subscribe_node.dart @@ -0,0 +1,36 @@ +import 'package:cbj_integrations_controller/integrations_controller.dart'; + +class NodeRedMatterSubscribeNode extends NodeRedVisualNodeAbstract { + NodeRedMatterSubscribeNode({ + required this.controller, + required this.deviceName, + required this.cluster, + required this.attr, + super.name, + }) : super( + type: 'mattersubscribe', + ); + + final String controller; + final String deviceName; + final String attr; + final int cluster; + + @override + String toString() { + return ''' + { + "id": "$id", + "type": "$type", + "name": "$name", + "controller": "$controller", + "device": "17174800272800391268-1", + "deviceName": "$deviceName", + "cluster": "$cluster", + "attr": "$attr", + "simpleMode": true, + "wires": ${fixWiresForNodeRed()} + } + '''; + } +} From 81beac15b5410b6f89abd3d9127207280b7f85b3 Mon Sep 17 00:00:00 2001 From: guyluz11 Date: Mon, 17 Feb 2025 18:50:40 +0200 Subject: [PATCH 3/3] Adding back MQTT --- .idea/misc.xml | 1 - bin/cbj_hub.dart | 2 +- .../matter_entities/matter_light_entity.dart | 31 +++++----- .../mqtt_server_repository.dart | 62 +++++-------------- 4 files changed, 35 insertions(+), 61 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 7f37698..781d2fb 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ -