From be96336a2c2fe18fb6da948e150171ac62d72e3f Mon Sep 17 00:00:00 2001 From: Noe Date: Wed, 12 Jun 2024 15:35:07 +0200 Subject: [PATCH 1/3] Commented line for Wittman in Salimax controller --- csharp/App/SaliMax/src/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index 98af9657c..490612e91 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -677,8 +677,8 @@ internal static class Program var request = s3Config.CreatePutRequest(s3Path); // This is temporary for Wittman, but now it's for all Installation - await File.WriteAllTextAsync("/var/www/html/status.csv", csv.SplitLines().Where(l => !l.Contains("Secret")).JoinLines()); - + //await File.WriteAllTextAsync("/var/www/html/status.csv", csv.SplitLines().Where(l => !l.Contains("Secret")).JoinLines()); + //Use this for no compression //var response = await request.PutAsync(new StringContent(csv)); From d4f34c31906910568a82136f149ffe33b6eb1f87 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 13 Jun 2024 15:18:05 +0200 Subject: [PATCH 2/3] update: send a csv file every 30 seconds fix: number of alarms and warnings calculation --- csharp/App/SchneiderMeterDriver/Config.cs | 2 +- .../dbus-fzsonick-48tl.py | 45 +++++++++++++----- .../.dbus-fzsonick-48tl.py.kate-swp | Bin 156 -> 0 bytes 3 files changed, 33 insertions(+), 14 deletions(-) delete mode 100644 python/dbus-fz-sonick-48tl-with-s3/.dbus-fzsonick-48tl.py.kate-swp diff --git a/csharp/App/SchneiderMeterDriver/Config.cs b/csharp/App/SchneiderMeterDriver/Config.cs index eb127b489..1d6270429 100644 --- a/csharp/App/SchneiderMeterDriver/Config.cs +++ b/csharp/App/SchneiderMeterDriver/Config.cs @@ -6,7 +6,7 @@ namespace InnovEnergy.App.SchneiderDriver; public static class Config { public const String Version = "1.0"; - public const String BusName = "com.victronenergy.grid.Schnieder"; + public const String BusName = "com.victronenergy.grid"; public const Byte ModbusNodeId = 1; public const String OwnAddress = "192.168.1.246"; public const String PeerAddress = "192.168.1.82"; diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py index 87a64c631..5786021c3 100755 --- a/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py @@ -193,29 +193,36 @@ def update_state_from_dictionaries(current_warnings, current_alarms, node_number alarms_number_list = [] for node_number in node_numbers: cnt = 0 - for alarm_value in current_alarms.values(): - if alarm_value: - cnt+=1 - alarms_number_list.append(cnt) + for i, alarm_value in enumerate(current_alarms.values()): + if int(list(current_alarms.keys())[i].split("/")[3]) == int(node_number): + if alarm_value: + cnt+=1 + alarms_number_list.append(cnt) + warnings_number_list = [] for node_number in node_numbers: cnt = 0 - for warning_value in current_warnings.values(): - if warning_value: - cnt+=1 + for i, warning_value in enumerate(current_warnings.values()): + if int(list(current_warnings.keys())[i].split("/")[3]) == int(node_number): + if warning_value: + cnt+=1 warnings_number_list.append(cnt) # Evaluate alarms if any(changed_alarms.values()): for i, changed_alarm in enumerate(changed_alarms.values()): if changed_alarm and list(current_alarms.values())[i]: - status_message["Alarms"].append(AlarmOrWarning(list(current_alarms.keys())[i],"System").to_dict()) + description = list(current_alarms.keys())[i].split("/")[-1] + device_created = "Battery node " + list(current_alarms.keys())[i].split("/")[3] + status_message["Alarms"].append(AlarmOrWarning(description, device_created).to_dict()) if any(changed_warnings.values()): for i, changed_warning in enumerate(changed_warnings.values()): if changed_warning and list(current_warnings.values())[i]: - status_message["Warnings"].append(AlarmOrWarning(list(current_warnings.keys())[i],"System").to_dict()) + description = list(current_warnings.keys())[i].split("/")[-1] + device_created = "Battery node " + list(current_warnings.keys())[i].split("/")[3] + status_message["Warnings"].append(AlarmOrWarning(description, device_created).to_dict()) if any(current_alarms.values()): status_message["Status"]=2 @@ -242,6 +249,10 @@ def update_state_from_dictionaries(current_warnings, current_alarms, node_number previous_warnings = current_warnings.copy() previous_alarms = current_alarms.copy() + #print("ALARMS LIST") + #print(alarms_number_list) + #print("WARNINGS LIST") + #print(warnings_number_list) return status_message, alarms_number_list, warnings_number_list @@ -492,8 +503,10 @@ def reset_batteries(modbus, batteries): alive = True # global alive flag, watchdog_task clears it, update_task sets it +start_time = time.time() def create_update_task(modbus, service, batteries): + global start_time # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] """ Creates an update task which runs the main update function @@ -504,11 +517,13 @@ def create_update_task(modbus, service, batteries): csv_signals = signals.create_csv_signals(first(batteries).firmware_version) node_numbers = [battery.slave_address for battery in batteries] + print("NODE NUMBERSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS") warnings_signals, alarm_signals = signals.read_warning_and_alarm_flags() current_warnings = {} current_alarms = {} def update_task(): + global start_time # type: () -> bool global alive @@ -523,11 +538,11 @@ def create_update_task(modbus, service, batteries): # Iterate over each node and signal to create rows in the new format for i, node in enumerate(node_numbers): for s in warnings_signals: - signal_name = insert_id(s.name, i+1) + signal_name = insert_id(s.name, node) value = s.get_value(statuses[i]) current_warnings[signal_name] = value for s in alarm_signals: - signal_name = insert_id(s.name, i+1) + signal_name = insert_id(s.name, node) value = s.get_value(statuses[i]) current_alarms[signal_name] = value @@ -535,7 +550,11 @@ def create_update_task(modbus, service, batteries): publish_values_on_dbus(service, _signals, statuses) - create_csv_files(csv_signals, statuses, node_numbers, alarms_number_list, warnings_number_list) + elapsed_time = time.time() - start_time + if elapsed_time >= 30: + create_csv_files(csv_signals, statuses, node_numbers, alarms_number_list, warnings_number_list) + start_time = time.time() + print("Elapsed time {:.2f} seconds".format(elapsed_time)) upload_status_to_innovenergy(_socket, statuses) @@ -548,7 +567,7 @@ def create_update_task(modbus, service, batteries): return update_task def manage_csv_files(directory_path, max_files=20): - csv_files = [f for f in os.listdir(directory_path)] + csv_files = [f for f in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, f))] csv_files.sort(key=lambda x: os.path.getctime(os.path.join(directory_path, x))) # Remove oldest files if exceeds maximum while len(csv_files) > max_files: diff --git a/python/dbus-fz-sonick-48tl-with-s3/.dbus-fzsonick-48tl.py.kate-swp b/python/dbus-fz-sonick-48tl-with-s3/.dbus-fzsonick-48tl.py.kate-swp deleted file mode 100644 index e7169fea259951b3a3d6b770689398e41b40b053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vnv03+1qGxUNDUKt;iTh_t6>RB!lojj= ulz9ilIzY@=> Date: Tue, 18 Jun 2024 13:11:58 +0200 Subject: [PATCH 3/3] send email to support team if there are >=2 limb strings in a battery --- .../App/Backend/Websockets/RabbitMQManager.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/csharp/App/Backend/Websockets/RabbitMQManager.cs b/csharp/App/Backend/Websockets/RabbitMQManager.cs index dcefab264..1238aa621 100644 --- a/csharp/App/Backend/Websockets/RabbitMQManager.cs +++ b/csharp/App/Backend/Websockets/RabbitMQManager.cs @@ -6,6 +6,7 @@ using InnovEnergy.App.Backend.Database; using InnovEnergy.App.Backend.DataTypes; using RabbitMQ.Client; using RabbitMQ.Client.Events; +using InnovEnergy.Lib.Mailer; namespace InnovEnergy.App.Backend.Websockets; @@ -61,6 +62,20 @@ public static class RabbitMqManager Console.WriteLine("----------------------------------------------"); int installationId = (int)Db.Installations.Where(f => f.Product == receivedStatusMessage.Product && f.S3BucketId == receivedStatusMessage.InstallationId).Select(f => f.Id).FirstOrDefault(); + string installationName = (string)Db.Installations.Where(f => f.Product == receivedStatusMessage.Product && f.S3BucketId == receivedStatusMessage.InstallationId).Select(f => f.InstallationName).FirstOrDefault(); + int bucketId = (int)Db.Installations.Where(f => f.Product == receivedStatusMessage.Product && f.S3BucketId == receivedStatusMessage.InstallationId).Select(f => f.S3BucketId).FirstOrDefault(); + int productId = (int)Db.Installations.Where(f => f.Product == receivedStatusMessage.Product && f.S3BucketId == receivedStatusMessage.InstallationId).Select(f => f.Product).FirstOrDefault(); + string monitorLink = ""; + if (productId == 0) + { + monitorLink = + $"https://monitor.innov.energy/installations/list/installation/{bucketId}/batteryview"; + } + else + { + monitorLink = + $"https://monitor.innov.energy/salidomo_installations/list/installation/{bucketId}/batteryview"; + } Console.WriteLine("Received a message from installation: " + installationId + " , product is: "+receivedStatusMessage.Product+ " and status is: " + receivedStatusMessage.Status); //This is a heartbit message, just update the timestamp for this installation. @@ -109,6 +124,25 @@ public static class RabbitMqManager DeviceCreatedTheMessage = alarm.CreatedBy, Seen = false }; Console.WriteLine("Add an alarm for installation "+installationId); + // Send replace battery email to support team if this alarm is "NeedToReplaceBattery" + if (alarm.Description == "NeedToReplaceBattery") + { + Console.WriteLine("Send replace battery email to the support team for installation "+installationId); + string recipient = "support@innov.energy"; + string subject = "Battery Alarm: 2 or more strings broken"; + string text = $"Dear InnovEnergy Support Team,\n" + + $"\n"+ + $"Installation Name: {installationName}\n"+ + $"\n"+ + $"Installation Monitor Link: {monitorLink}\n"+ + $"\n"+ + $"Please exchange: {alarm.CreatedBy}\n"+ + $"\n"+ + $"Error created date and time: {alarm.Date} {alarm.Time}\n"+ + $"\n"+ + $"Thank you for your great support:)"; + Mailer.Send("InnovEnergy Support Team", recipient, subject, text); + } //Create a new error and add it to the database Db.HandleError(newError, installationId); }