From b4f9cbe40b9cd6e451882b7c6269397771395b92 Mon Sep 17 00:00:00 2001 From: Damien Albisson Date: Tue, 4 Jun 2024 15:47:28 +0200 Subject: [PATCH 1/3] Add thermo widget (need to add frequency of read) --- lib/after_setup_pages/userspace_page.dart | 3 + lib/userspace_widgets/ic_thermometer.dart | 147 ++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 lib/userspace_widgets/ic_thermometer.dart diff --git a/lib/after_setup_pages/userspace_page.dart b/lib/after_setup_pages/userspace_page.dart index 274c5cf..9c2106f 100644 --- a/lib/after_setup_pages/userspace_page.dart +++ b/lib/after_setup_pages/userspace_page.dart @@ -13,6 +13,7 @@ import 'package:panduza_sandbox_flutter/userspace_widgets/ic_not_managed.dart'; import 'package:panduza_sandbox_flutter/data/interface_connection.dart'; import 'package:panduza_sandbox_flutter/userspace_widgets/ic_relay.dart'; +import 'package:panduza_sandbox_flutter/userspace_widgets/ic_thermometer.dart'; import 'package:panduza_sandbox_flutter/utils_widgets/appBar.dart'; import 'package:panduza_sandbox_flutter/data/broker_connection_info.dart'; @@ -157,6 +158,8 @@ class _UserspacePageState extends State { return IcPlatform(ic); case "powermeter": return IcPowermeter(ic); + case "thermometer": + return IcThermometer(ic); case "relay": return IcRelay(ic); default: diff --git a/lib/userspace_widgets/ic_thermometer.dart b/lib/userspace_widgets/ic_thermometer.dart new file mode 100644 index 0000000..03f6547 --- /dev/null +++ b/lib/userspace_widgets/ic_thermometer.dart @@ -0,0 +1,147 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:panduza_sandbox_flutter/data/const.dart'; +import 'templates.dart'; +import '../../data/interface_connection.dart'; + +import 'dart:convert'; + +// import '../widgets/interface_control/icw_bpc.dart'; +import 'package:mqtt_client/mqtt_client.dart'; + +class IcThermometer extends StatefulWidget { + const IcThermometer(this._interfaceConnection, {super.key}); + + final InterfaceConnection _interfaceConnection; + + @override + _IcThermometerState createState() => _IcThermometerState(); +} + +class _IcThermometerState extends State { + + double _value = 0; + + /// + /// + void onMqttMessage(List> c) { + print("============"); + print('Received ${c[0].topic} from ${widget._interfaceConnection.topic} '); + + // + if (c[0].topic.startsWith(widget._interfaceConnection.topic)) { + if (!c[0].topic.endsWith('/info')) { + final recMess = c![0].payload as MqttPublishMessage; + + final pt = + MqttPublishPayload.bytesToStringAsString(recMess.payload.message); + + var jsonObject = json.decode(pt); + + print(jsonObject); + + // Map updateAtts = Map.from(_attsEffective); + + + for (MapEntry atts in jsonObject.entries) { + for (MapEntry field in atts.value.entries) { + print('${atts.key} ${field.key} => ${field.value}'); + + switch (atts.key) { + case "temperature": + if (field.key == "value") { + double update_val = 0; + switch (field.value.runtimeType) { + case int: + update_val = field.value.toDouble(); + case double: + update_val = field.value; + } + setState(() { + _value = update_val; + }); + } + + if (field.key == "decimals") { + + } + break; + } + } + } + + } + } else { + // print('not good:'); + } + } + + /// Initialize MQTT Subscriptions + /// + void initializeMqttSubscription() async { + widget._interfaceConnection.client.updates!.listen(onMqttMessage); + + String attsTopic = "${widget._interfaceConnection.topic}/atts/#"; + // print(attsTopic); + Subscription? sub = widget._interfaceConnection.client + .subscribe(attsTopic, MqttQos.atLeastOnce); + + } + + late TextEditingController _freqController; + late TextEditingController _freqControllerRequested; + + /// Perform MQTT Subscriptions at the start of the component + /// + @override + void initState() { + super.initState(); + + // subscribe to info and atts ? + Future.delayed(const Duration(milliseconds: 1), initializeMqttSubscription); + + _freqController = TextEditingController(text: "1"); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Card( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + cardHeadLine(widget._interfaceConnection), + Text( + "${_value.toString()} °C", + style: TextStyle( + color: black + ), + ), + Row( + children: [ + SizedBox( + width: 100, + child: TextField( + controller: _freqController, + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly + ], + ) + ), + Text( + "read per sec", + style: TextStyle( + color: black + ), + ), + ], + ) + ], + )); + } +} From fc219ed091db6295f535136a679d702c32bfb9c4 Mon Sep 17 00:00:00 2001 From: Damien Albisson Date: Wed, 5 Jun 2024 14:10:45 +0200 Subject: [PATCH 2/3] Change thermo atts to measure to uniform measure device --- lib/userspace_widgets/ic_powermeter.dart | 47 +---------------------- lib/userspace_widgets/ic_thermometer.dart | 15 +++----- 2 files changed, 7 insertions(+), 55 deletions(-) diff --git a/lib/userspace_widgets/ic_powermeter.dart b/lib/userspace_widgets/ic_powermeter.dart index a7929d9..29fd291 100644 --- a/lib/userspace_widgets/ic_powermeter.dart +++ b/lib/userspace_widgets/ic_powermeter.dart @@ -14,18 +14,10 @@ class IcPowermeter extends StatefulWidget { final InterfaceConnection _interfaceConnection; @override - _IcPowermeterState createState() => _IcPowermeterState(); + State createState() => _IcPowermeterState(); } class _IcPowermeterState extends State { - // bool? _enableValueReq; - // bool? _enableValueEff; - - // double? _voltageValueReq; - // double? _voltageValueEff; - - // double? _currentValueReq; - // double? _currentValueEff; double _value = 0; @@ -47,8 +39,6 @@ class _IcPowermeterState extends State { print(jsonObject); - // Map updateAtts = Map.from(_attsEffective); - setState(() { for (MapEntry atts in jsonObject.entries) { for (MapEntry field in atts.value.entries) { @@ -70,44 +60,9 @@ class _IcPowermeterState extends State { } break; } - - // case "voltage": - // if (field.key == "value") { - // // print("pokkk !! ${field.value.runtimeType}"); - // switch (field.value.runtimeType) { - // case int: - // _voltageValueEff = field.value.toDouble(); - // case double: - // _voltageValueEff = field.value; - // } - // _voltageValueReq ??= _voltageValueEff; - // } - // break; - - // case "current": - // if (field.key == "value") { - // // print("pokkk !! ${field.value.runtimeType}"); - // switch (field.value.runtimeType) { - // case int: - // _currentValueEff = field.value.toDouble(); - // case double: - // _currentValueEff = field.value; - // } - // _currentValueReq ??= _currentValueEff; - // } - // break; - // } } } }); - // print(updateAtts); - - // setState(() { - // _attsEffective = updateAtts; - // }); - // _attsEffective - - // print(jsonObject.runtimeType); } } else { // print('not good:'); diff --git a/lib/userspace_widgets/ic_thermometer.dart b/lib/userspace_widgets/ic_thermometer.dart index 03f6547..fea4cb8 100644 --- a/lib/userspace_widgets/ic_thermometer.dart +++ b/lib/userspace_widgets/ic_thermometer.dart @@ -15,7 +15,7 @@ class IcThermometer extends StatefulWidget { final InterfaceConnection _interfaceConnection; @override - _IcThermometerState createState() => _IcThermometerState(); + State createState() => _IcThermometerState(); } class _IcThermometerState extends State { @@ -39,26 +39,23 @@ class _IcThermometerState extends State { var jsonObject = json.decode(pt); print(jsonObject); - - // Map updateAtts = Map.from(_attsEffective); - for (MapEntry atts in jsonObject.entries) { for (MapEntry field in atts.value.entries) { print('${atts.key} ${field.key} => ${field.value}'); switch (atts.key) { - case "temperature": + case "measure": if (field.key == "value") { - double update_val = 0; + double updateVal = 0; switch (field.value.runtimeType) { case int: - update_val = field.value.toDouble(); + updateVal = field.value.toDouble(); case double: - update_val = field.value; + updateVal = field.value; } setState(() { - _value = update_val; + _value = updateVal; }); } From 29384ca76656ba9261ac83f77d460030c4bc3197 Mon Sep 17 00:00:00 2001 From: Damien Albisson Date: Thu, 6 Jun 2024 09:44:09 +0200 Subject: [PATCH 3/3] improve widget design --- lib/userspace_widgets/ic_thermometer.dart | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/userspace_widgets/ic_thermometer.dart b/lib/userspace_widgets/ic_thermometer.dart index fea4cb8..e8cae01 100644 --- a/lib/userspace_widgets/ic_thermometer.dart +++ b/lib/userspace_widgets/ic_thermometer.dart @@ -22,8 +22,9 @@ class _IcThermometerState extends State { double _value = 0; - /// - /// + /// Init each value of the thermometer, here just the measure + /// temperature + /// void onMqttMessage(List> c) { print("============"); print('Received ${c[0].topic} from ${widget._interfaceConnection.topic} '); @@ -105,6 +106,8 @@ class _IcThermometerState extends State { super.dispose(); } + /// Appearance of the widget + /// @override Widget build(BuildContext context) { return Card( @@ -123,13 +126,21 @@ class _IcThermometerState extends State { SizedBox( width: 100, child: TextField( + textDirection: TextDirection.rtl, controller: _freqController, keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter.digitsOnly ], + style: TextStyle( + color: black, + fontSize: 16 + ), ) ), + const SizedBox( + width: 10, + ), Text( "read per sec", style: TextStyle( @@ -137,7 +148,10 @@ class _IcThermometerState extends State { ), ), ], - ) + ), + const SizedBox( + height: 10, + ), ], )); }